无法在处理器中注入bean

时间:2017-11-10 07:37:26

标签: apache-camel apache-camel-cdi

我正在尝试在处理器中使用 file2=open(r"C:\Users\pc\Desktop\itika study material\cs\student\data.log","rb") 但它总是@BeanInject

我可以在null中访问bean,如果在RouteBuilder中定义,则可以访问处理器,但如果Processor类在自己的文件中,则不能访问。

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

[更新] 我正在使用Apache Camel 2.17.2,代码取自camel-example-cdi 下面的代码在第一个处理器中打印对象实例,但不打印第二个处理器。代码在单元测试中运行。

RouteBuilder

处理器

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");
   }
}

2 个答案:

答案 0 :(得分:2)

如果你正在使用CDI,那么你应该赞成使用@BeanInject而不是Camel的MyProcessor - 如果你不使用CDI或Spring IoC等,后者是一个可怜的人替代品,并且只能使用对于骆驼豆。

就您的问题而言,因为您通过新的构造函数自己创建@Inject实例。然后它的标准Java创建实例而不是CDI或Apache Camel这样做,因此你不能有依赖注入。

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

答案 1 :(得分:1)

在制作人中,您可以使用注册表中的查找方法

SomeBean someBean = (SomeBean)exchange.getContext().getRegistry().lookupByName("someBean");