1

我正在尝试@BeanInject在处理器中使用,但它始终是null.

如果处理器类在其自己的文件中RouteBuilder定义,我可以访问 a 中的 bean ,也可以访问处理器中的 bean。RouteBuilder

这是不支持还是我错过了什么?

[更新] 我使用的是 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 + "]");
}
}
4

2 回答 2

3

如果您使用的是 CDI,那么您应该优先使用@InjectCamel's @BeanInject- 如果您不使用 CDI 或 Spring IoC 等,后者是一个可怜的替代品,并且仅可用于 Camel bean。

就您的问题而言,这是因为您MyProcessor自己通过 new 构造函数创建了实例。然后是创建实例的标准 Java,而不是 CDI 或 Apache Camel,因此您不能进行依赖注入。

您可以使用 CDI 及其命名的 bean,然后在您的处理器中进行依赖注入 - 例如使用标准 CDI 注释。并将您的处理器通过@Inject注入RouteBuilder并从您的 Camel 路由中调用此实例。

于 2017-11-10T09:17:59.493 回答
1

在生产者中,您可以使用注册表中的查找方法

SomeBean someBean = (SomeBean)exchange.getContext().getRegistry().lookupByName("someBean");
于 2018-04-10T11:45:13.000 回答