无法在处理器中注入 bean
Cant inject bean in Processor
我正在尝试在处理器中使用 @BeanInject
,但它始终是 null
。
我可以在 RouteBuilder
中访问 bean,如果它在 RouteBuilder
中定义,也可以在处理器中访问,但如果处理器 class 在其自己的文件中则不能。
这是不受支持还是我遗漏了什么?
[更新]
我正在使用 Apache Camel 2.17.2,代码取自 camel-example-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 或 Apache Camel 这样做,因此您不能进行依赖注入。
您可以使用 CDI 及其命名 bean,然后在您的处理器中也进行依赖注入 - 例如使用标准 CDI 注释。并通过 @Inject
将您的处理器注入 RouteBuilder
并从您的 Camel 路由调用此实例。
在生产者中,您可以使用注册表中的查找方法
SomeBean someBean = (SomeBean)exchange.getContext().getRegistry().lookupByName("someBean");
我正在尝试在处理器中使用 @BeanInject
,但它始终是 null
。
我可以在 RouteBuilder
中访问 bean,如果它在 RouteBuilder
中定义,也可以在处理器中访问,但如果处理器 class 在其自己的文件中则不能。
这是不受支持还是我遗漏了什么?
[更新] 我正在使用 Apache Camel 2.17.2,代码取自 camel-example-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 或 Apache Camel 这样做,因此您不能进行依赖注入。
您可以使用 CDI 及其命名 bean,然后在您的处理器中也进行依赖注入 - 例如使用标准 CDI 注释。并通过 @Inject
将您的处理器注入 RouteBuilder
并从您的 Camel 路由调用此实例。
在生产者中,您可以使用注册表中的查找方法
SomeBean someBean = (SomeBean)exchange.getContext().getRegistry().lookupByName("someBean");