Перехват CDI-бинов, созданных с помощью метода @Produces

В нашем JEE-приложении мы создали новую аннотацию @MyAnnotation, которую устанавливаем для компонентов CDI (@ApplicationScoped).
Затем у нас есть перехватчик, который перехватывает все бины с аннотацией @MyAnnotation.
Проблема в том, что он не работает для бинов, созданных методом @Produces.
Это означает, что перехватчик не вызывается.

Итак, если у нас есть этот класс:

@ApplicationScoped
public class OtherClass
{
     @Inject
     private MyBean myBean;

     public void f()
     {
        myBean.g();
     }
}

Тогда будет работать следующее:

@ApplicationScoped
@MyAnnotation
public class MyBean
{
   public void g() {}
}

Но ниже не будет:

@ApplicationScoped
public class MyBeanProducer 
{

    @Produces
    public MyBean create() 
    {
        return new MyBean();
    }
}

Есть ли способ заставить перехватчик перехватывать компоненты CDI, созданные с помощью @Produces?

Вы пытались добавить аннотацию «@MyAnnotation» к методу «@Produces»?

mtj 23.12.2020 10:34

Зачем вам нужен Producer для компонента ApplicationScoped?

frank 23.12.2020 10:56

Ваш продюсер создает bean-компонент @Dependent. Зависимый — это псевдообласть, и компоненты в этой области не могут быть перехвачены, потому что перехватчики работают через прокси, а псевдообласти не создают прокси для своих компонентов. Вы пытались аннотировать метод производителя с помощью @ApplicationScoped - кажется, это то, что вы все равно хотите для этого компонента.

Nikos Paraskevopoulos 23.12.2020 15:48

@mtj да, я пытался. Установка "@MyAnnotation" в методе "@Produces" заставляет перехватчик перехватывать сам метод "@Produces" вместо метода g() MyBean.

YevgenyL 24.12.2020 15:49

@NikosParaskevopoulos да, я пробовал, устанавливая «@ApplicationScoped» для метода «@Producer», но перехвата все равно не было.

YevgenyL 24.12.2020 16:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
254
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решение состоит в том, чтобы использовать InterceptionFactory (из CDI 2.0) для прокси-компонента, созданного методом @Poduces, что означает:

@ApplicationScoped
public class MyBeanProducer 
{

    @Produces
    public MyBean create(InterceptionFactory<MyBean> interceptionFactory) 
    {
        return interceptionFactory.createInterceptedInstance(new MyBean());
    }
}

@MyAnnotation должен быть на MyBean.
MyBean ДОЛЖЕН ИМЕТЬ конструктор без аргументов, чтобы быть проксируемым, потому что interceptionFactory.createInterceptedInstance() делает именно это — проксирует экземпляр MyBean. Я нашел решение здесь

Другие вопросы по теме