Фильтр компонентов верблюжьего файла с помощью cdi

Я использую верблюд без Spring Framework (вместо CDI). Как я могу установить фильтр для компонента Camel-File?

Мой класс фильтра выглядит так:

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

Итак, я попробовал это:

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

Но я получаю:

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

Что мне не хватает?

Обновить:

Обратите внимание, что бин зарегистрирован. Если я использую:

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

затем MyFilter was triggered отображается в журнале.

Таким образом, проблема заключается в настройке фильтра файловых компонентов.

2 ответа

Решение

Обновление: поскольку Camel-cdi использует JNDI-registry, фильтр настроен так:

filter=#java:global/Abc/MyFilter

Поскольку я не использую Spring и параметр фильтра ожидает экземпляр, а не только имя класса, необходим TypeConverter

@Converter
public class MyGenericFileFilterConverter implements TypeConverters {

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

Вы добавили myFilter в свой реестр?

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()); 

Эта часть должна быть в методе настройки вашего routeBuilder.

Другие вопросы по тегам