2016-06-17 6 views
0

Ich benutze Kamel ohne das Spring-Framework (mit CDI statt). Wie kann ich einen Filter für die camel-Datei-Komponente einstellen?camel-datei komponentenfilter mit cdi

sieht Mein Filterklasse wie folgt aus:

@Named 
@Stateless 
public class MyFilter<T> implements GenericFileFilter<T> { 
    System.out.println("MyFilter was triggered"); 
    ....... 

So habe ich versucht, dies:

<route> 
    <from uri="file://somewhere?filter=#myFilter"/> 
    <to uri="...."/> 
</route> 

Aber ich bin immer:

java.lang.IllegalArgumentException: Could not find a suitable setter for 
property: filter as there isn't a setter method with same type: 
java.lang.String nor type conversion possible: No type converter 
available to convert from type: java.lang.String to the required type: 
org.apache.camel.component.file.GenericFileFilter with value #myFilter 

Was bin ich?

Update:

Bitte beachten Sie, dass die Bohne registriert ist. Wenn ich benutze:

<to uri="ejb:java:global/Abc/MyFilter?method=accept"/> 

dann MyFilter was triggered zeigt im Protokoll auf.

Das Problem besteht also in der Konfiguration des Dateikomponentenfilters.

Antwort

1

Update: Seit Camel-cdi JNDI-Registry verwendet, wird der Filter wie folgt konfiguriert:

filter=#java:global/Abc/MyFilter 

Da ich Frühling nicht und der Filterparameter eine Instanz und nicht nur wartet ein Klassenname ist ein Typeconverter notwendig

@Converter 
public class MyGenericFileFilterConverter implements TypeConverters { 

    @Converter 
    public static GenericFileFilter toMYFilter(String filter){ 
     return new MyFilter(); 
    } 
} 

+0

Dies ist keine gute Lösung. Sie richten einen Konverter von einem 'String' zu einem' GenericFileFilter' ein, der die von Ihnen verwendete Implementierung fest codiert. Wenn Sie einen neuen 'GenericFileFilter' hinzufügen würden, würde dies nicht funktionieren. Wie @Souciance sagte, ist Ihr Problem, dass die 'myFilter' Bean nicht registriert ist. Das Erstellen einer Registrierung und das Hinzufügen zu dem Kontext ist möglicherweise nicht Ihre bevorzugte Methode, aber Sie müssen entweder Spring verwenden oder herausfinden, was in Ihrem Camel CDI-Setup fehlerhaft ist. Sie werden in Ihrem obigen Beispiel bemerken, wenn Sie sagen, dass die Bean registriert ist, verwenden Sie nicht ihren Bean-Namen, sondern den vollständigen Pfad. – AndyN

-1

Haben Sie myFilter zu Ihrer Registrierung hinzugefügt?

final CamelContext camelContext = getContext(); 
final org.apache.camel.impl.SimpleRegistry registry = new org.apache.camel.impl.SimpleRegistry(); 
final org.apache.camel.impl.CompositeRegistry compositeRegistry = new org.apache.camel.impl.CompositeRegistry(); 
compositeRegistry.addRegistry(camelContext.getRegistry()); 
compositeRegistry.addRegistry(registry); 
((org.apache.camel.impl.DefaultCamelContext) camelContext).setRegistry(compositeRegistry); 
registry.put("myFilter", new MyFilter()); 

Dieser Teil sollte in der configure-Methode Ihres routeBuilder sein.

+0

Was ist mit der Downvote? –

+0

Die Frage bezieht sich auf camel-cdi, also ist deine Antwort ein wenig off-topic. – sinclair

+0

Ja, aber Ihr Fehler zeigt an, dass der Verweis auf myFilter nicht in der Registrierung für Camel vorhanden ist, um ihn zu finden. –