带有 cdi 的骆驼文件组件过滤器
camel-file component filter with cdi
我使用的是没有 Spring 框架的 camel(而是使用 CDI)。
如何为骆驼文件组件设置过滤器?
我的过滤器 class 看起来像这样:
@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
出现在日志中。
所以问题是关于配置文件组件过滤器。
您是否将 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 的配置方法中。
更新:
由于 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();
}
}
我使用的是没有 Spring 框架的 camel(而是使用 CDI)。 如何为骆驼文件组件设置过滤器?
我的过滤器 class 看起来像这样:
@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
出现在日志中。
所以问题是关于配置文件组件过滤器。
您是否将 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 的配置方法中。
更新: 由于 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();
}
}