У меня было несколько классов процессора, которые не реализуют никакого интерфейса:
public class Processor1 {
}
@Stateles
public class Processor2 {
}
public class Processor3 {
}
Один из них - это управляемый контейнером bean-компонент без сохранения состояния.
В класс обслуживания внедрены все процессоры:
public class MyService {
@Inject private Processor1 p1;
@Inject private Processor2 p2;
@Inject private Processor3 p3;
}
Затем у меня было требование, чтобы все процессоры реализовали интерфейс ProcessorInterfase;
После того, как я изменил код, развертывание завершилось ошибкой:
Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type Processor2 with qualifiers @Default
ОК. Я создал новый Qualifier @ Process2Bean и добавил его в объявление Processor2:
@Stateles
@Process2Bean
public class Processor2 {
}
и до точки впрыска:
public class MyService {
@Inject private Processor1 p1;
@Inject @Process2Bean private Processor2 p2;
@Inject private Processor3 p3;
}
Теперь у меня следующая ошибка развертывания:
Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type Processor2 with qualifiers @Process2Bean
at injection point [UnbackedAnnotatedField] @Inject @Process2Bean private a.b.c.MyService.p2
Я сделал что-то не так? Спасибо.
Это похоже на поворот проблемы, на которую я ответил в этот вопрос.
Короче говоря, когда вы внедряете компоненты EJB, вам необходимо внедрять их на основе их видимых для клиента частей - интерфейсов. Если, конечно, у вас нет представления без интерфейса, как это было в исходном сценарии. Спецификация CDI покрывает это, если вы хотите прочитать.
Вам нужно будет ввести Processor2
через ProcessorInterfase
. Но есть три реализации, поэтому это приведет к неоднозначной зависимости, поэтому вам также понадобится квалификатор. Окончательное решение может выглядеть так:
@Inject
@Process2Bean
ProcessorInterfase processor2;
Извините, был в отпуске.
Странно, imO Квалификатор не должен быть нужен. Что произойдет, если вы аннотируете процессор p2 с помощью @EJB вместо @Inject?