компонентный фильтр файла верблюда с cdi

Я использую верблюд без среды Spring (вместо этого использую 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.

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


person sinclair    schedule 17.06.2016    source источник


Ответы (2)


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

filter=#java:global/Abc/MyFilter

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

@Converter
public class MyGenericFileFilterConverter implements TypeConverters {

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

person sinclair    schedule 20.06.2016
comment
Это не очень хорошее решение. Вы настраиваете преобразователь из String в GenericFileFilter, который жестко кодирует используемую вами реализацию. Если бы вы добавили новый GenericFileFilter, это бы не сработало. Как сказал @Souciance, ваша проблема в том, что компонент myFilter не зарегистрирован. Создание реестра и добавление его в контекст может быть не вашим предпочтительным методом, но вам нужно либо использовать Spring, либо выяснить, что не работает в вашей настройке Camel CDI. Вы заметите, что в приведенном выше примере, когда вы говорите, что компонент зарегистрирован, вы используете не его имя, а полный путь. - person AndyN; 21.06.2016

Вы добавили 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()); 

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

person Souciance Eqdam Rashti    schedule 18.06.2016
comment
Вопрос о camel-cdi, так что ваш ответ немного не по теме. - person sinclair; 20.06.2016
comment
Да, но ваша ошибка указывает на то, что ссылка на myFilter не существует в реестре, чтобы Camel мог ее найти. - person Souciance Eqdam Rashti; 20.06.2016