无法在处理器中注入 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");