Не могу ввести боб в процессор
Я пытаюсь использовать @BeanInject
в процессоре, но это всегда null
,
Я могу получить доступ к бобу в RouteBuilder
, а также в процессоре, если он определен в RouteBuilder
но не если класс Processor находится в своем собственном файле.
Это не поддерживается или я что-то упустил?
[Обновлено] Я использую 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 + "]");
}
}
2 ответа
Если вы используете CDI, вы должны отдать предпочтение использованию @Inject
над верблюдом @BeanInject
- последний является плохой заменой, если вы не используете CDI, Spring IoC и т. д., и может использоваться только для бобов Camel.
С точки зрения вашей проблемы, потому что вы создаете MyProcessor
пример себя с помощью нового конструктора. Затем его стандартная Java, которая создает экземпляр, а не его CDI или Apache Camel, делают это, и поэтому у вас не может быть внедрения зависимости.
Вы можете использовать CDI и его именованные bean-компоненты, а затем внедрять зависимости в свои процессоры - например, использовать стандартные аннотации CDI. И введите ваш процессор через @Inject
в RouteBuilder
и назовите этот экземпляр с вашего верблюжьего маршрута.
В продюсере вы можете использовать метод поиска из реестра
SomeBean someBean = (SomeBean)exchange.getContext().getRegistry().lookupByName("someBean");