В нашем 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?
Зачем вам нужен Producer для компонента ApplicationScoped?
Ваш продюсер создает bean-компонент @Dependent. Зависимый — это псевдообласть, и компоненты в этой области не могут быть перехвачены, потому что перехватчики работают через прокси, а псевдообласти не создают прокси для своих компонентов. Вы пытались аннотировать метод производителя с помощью @ApplicationScoped
- кажется, это то, что вы все равно хотите для этого компонента.
@mtj да, я пытался. Установка "@MyAnnotation" в методе "@Produces" заставляет перехватчик перехватывать сам метод "@Produces" вместо метода g() MyBean.
@NikosParaskevopoulos да, я пробовал, устанавливая «@ApplicationScoped» для метода «@Producer», но перехвата все равно не было.
Решение состоит в том, чтобы использовать 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.
Я нашел решение здесь
Вы пытались добавить аннотацию «@MyAnnotation» к методу «@Produces»?