Не могу ввести боб в процессор

Я пытаюсь использовать @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");
Другие вопросы по тегам