Добавить CDI-декоратор в Message Driven Bean - PullRequest
1 голос
/ 16 января 2020

С учетом следующего компонента, управляемого сообщениями, возможно ли определить глобальный декоратор из спецификации CDI для добавления дополнительного поведения?

@MessageDriven
public class MyMessageDrivenBean implements MessageListener {

    @Override
    public void onMessage(Message m) {

    }
}

Декоратор выглядит следующим образом:

@Decorator
@Priority(Interceptor.Priority.APPLICATION)
public abstract DecorateMyMessageDrivenBean implements MessageListener {

    @Inject
    @Delegate
    @Any
    private MessageListener delegate;

    @Override
    public void onMessage(Message m) {

    }
}

В настоящее время декоратор не выполняется. Я добавил файл bean. xml в мой модуль.

1 Ответ

1 голос
/ 17 января 2020

Короткий ответ (но не теряйте надежды) - нет, потому что @MessageDrivenBean не является управляемым компонентом CDI, и только управляемые компоненты CDI могут быть декораторами .

Теперь то, что вы могли бы сделать (а у меня нет опыта делать это самостоятельно), выглядит примерно так:

  • используйте @javax.annotation.Resource для вызова MessageListener для внедрения в поле Java EE, а не CDI (поэтому он будет найден в JNDI)
  • написать метод источника, который @Produces MessageListener экземпляров, используя комбинацию содержимое этого поля и метод createInterceptionFactory
  • @Inject MessageListener, создаваемый там, где вы хотите его использовать

An InterceptionFactory - это действительно единственный механизм, которым вы должны динамически добавлять перехват (а декоратор - это просто особый случай перехвата) к вещам, которые не являются управляемыми компонентами CDI.

Наконец, это будет работать только если вы используете CDI 2.0 (в Java EE 8 или выше).

...