0

我正在使用没有 Spring 框架的骆驼(使用 CDI 代替)。如何为骆驼文件组件设置过滤器?

我的过滤器类如下所示:

@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

我错过了什么?

更新:

请注意,bean 已注册。如果我使用:

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

然后MyFilter was triggered出现在日志中。

所以问题在于配置文件组件过滤器。

4

2 回答 2

1

更新: 由于 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();
   }
}

于 2016-06-20T10:34:29.133 回答
-1

您是否将 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 的配置方法中。

于 2016-06-18T15:48:48.393 回答