Apache camel 无法在处理器中注入bean
我试图在处理器中使用Apache camel 无法在处理器中注入bean,apache-camel,apache-camel-cdi,Apache Camel,Apache Camel Cdi,我试图在处理器中使用@BeanInject,但它总是null 我可以访问RouteBuilder中的bean,如果它是在RouteBuilder中定义的,也可以访问处理器中的bean,但如果处理器类在自己的文件中,则不能访问 这是不受支持还是我遗漏了什么 [更新] 我使用的是ApacheCamel 2.17.2,代码取自Camel示例cdi 下面的代码在第一个处理器(而不是第二个)中打印对象实例。代码在单元测试中运行 public class MyRoutes extends RouteBuil
@BeanInject
,但它总是null
我可以访问RouteBuilder
中的bean,如果它是在RouteBuilder
中定义的,也可以访问处理器中的bean,但如果处理器类在自己的文件中,则不能访问
这是不受支持还是我遗漏了什么
[更新]
我使用的是ApacheCamel 2.17.2,代码取自Camel示例cdi
下面的代码在第一个处理器(而不是第二个)中打印对象实例。代码在单元测试中运行
public class MyRoutes extends RouteBuilder {
final static Logger LOG = LoggerFactory.getLogger(MyRoutes.class);
@Inject
@Uri("timer:foo?period=5000" )
private Endpoint inputEndpoint;
@Inject
@Uri("log:output")
private Endpoint resultEndpoint;
@BeanInject
private SomeBean someBean;
@Override
public void configure() {
from("timer:foo?period=500")
.to("bean:counterBean")
.process(new Processor(){
@Override
public void process(Exchange exchange) throws Exception {
LOG.info("[" + someBean + "]");
}
})
.process(new MyProcessor())
.to("mock:result");
}
}
处理器
public class MyProcessor implements Processor {
final static Logger LOG = LoggerFactory.getLogger(MyProcessor.class);
@BeanInject
private SomeBean someBean;
@Override
public void process(Exchange exchange) throws Exception {
LOG.info("In processor [" + someBean + "]");
}
}
如果您使用的是CDI,那么您应该更喜欢使用
@Inject
而不是Camel的@BeanInject
——如果您不使用CDI或Spring IoC等,后者是穷人的替代品,并且只能用于骆驼豆
就您的问题而言,这是因为您通过新的构造函数自己创建了MyProcessor
实例。然后是创建实例的标准Java,而不是CDI或ApacheCamel,因此不能进行依赖项注入
您可以使用CDI及其命名bean,然后在处理器中进行依赖项注入——例如使用标准CDI注释。然后通过
@inject
将处理器注入RouteBuilder
并从Camel路径调用此实例。如果您使用的是CDI,那么您应该倾向于使用@inject
而不是Camel的@BeanInject
——如果您不使用CDI或Spring IoC等,后者是穷人的替代品,而且只适用于骆驼豆
就您的问题而言,这是因为您通过新的构造函数自己创建了MyProcessor
实例。然后是创建实例的标准Java,而不是CDI或ApacheCamel,因此不能进行依赖项注入
您可以使用CDI及其命名bean,然后在处理器中进行依赖项注入——例如使用标准CDI注释。并通过
@inject
将处理器注入RouteBuilder
,并从骆驼路径调用此实例。在producer中,您可以使用注册表中的查找方法
SomeBean someBean = (SomeBean)exchange.getContext().getRegistry().lookupByName("someBean");
在producer中,可以使用注册表中的查找方法
SomeBean someBean = (SomeBean)exchange.getContext().getRegistry().lookupByName("someBean");
如果您展示一些代码,告诉我们您使用的Camel版本,以及如何启动/运行CamelHi,对不起,是的,我应该这样做。我已经更新了帖子。如果你展示一些代码,告诉我们你使用的是什么版本的Camel,以及你如何启动/运行CamelHi,很抱歉,是的,我应该这么做。我已经更新了帖子。谢谢你的帮助。我必须重新考虑我的方法。谢谢你的帮助,克劳斯。那时我将不得不重新考虑我的方法。