org.jboss.weld.exceptions.UnsatisfiedResolutionException WELD-001334 Неудовлетворенные зависимости для типа MyInterface с квалификаторами @Any @MyAnnotation - PullRequest
0 голосов
/ 08 марта 2019

У меня есть проект Java 8 и сервер JBoss 7.1.0GA.У меня есть класс пакета с глобальной переменной

@EJB
public MyInterface delegate;

, которая определена как экземпляр DelegateClass в моем файле ejb-jar.xml:

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" version="3.1"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd">
    <module-name>moduleName</module-name>
<enterprise-beans>
    <session>
        <ejb-name>ejbName</ejb-name>
        <business-remote>MyInterface</business-remote>
        <ejb-class>DelegateClass</ejb-class>
        <session-type>Stateless</session-type>
    </session>
</enterprise-beans>

IУ меня есть некоторые реализации MyInterface, поэтому в моем классе DelegateClass я хочу обернуть реализацию MyInterface и установить ее с помощью константы enum.Вот код:

@Stateless
@LocalBean
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class DelegateClass implements MyInterface {

@Inject
@Any
protected Instance<MyInterface> instance;

protected MyInterface selectedImpl;

@PostConstruct
public void init() {
    selectedImpl = instance.select(MyLiteralAnnotation.create(MyEnum.value)).get();
}

Вот код моего буквального класса аннотаций:

public class MyLiteralAnnotation extends AnnotationLiteral<MyAnnotation> implements MyAnnotation {

private final MyEnum value;

private MyLiteralAnnotation(MyEnum value) {
    this.value = value;
}

@Override
public MyEnum getValue() {
    return value;
}

public static MyLiteralAnnotation create(MyEnum value) {
    return new MyLiteralAnnotation(value);
}

}

аннотация, которую я создал:

@Retention(RetentionPolicy.RUNTIME)

@Target({ TYPE, METHOD, FIELD, PARAMETER, CONSTRUCTOR }) 
@Qualifier 
public @interface MyAnnotation {

MyEnum getValue();
}

и реализация, которую я хочу получить из instance.select (...)

@Stateless
@LocalBean
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@MyAnnotation(MyEnum.value)
public class MyInterfaceImpl implements MyInterface {
....
}

Я отлаживаю приложение на моем сервере, но когда я пытаюсь создать экземпляр поля selectImpl с помощью instance.select(...), у меня есть исключение:

org.jboss.weld.exceptions.UnsatisfiedResolutionException WELD-001334 Неудовлетворенные зависимости для типа MyInterface с квалификаторами @Any @ MyAnnotation

Может кто-нибудь помочь мне, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Я решил свою проблему, добавив аннотацию @ApplicationScope поверх определения класса делегата.

0 голосов
/ 30 марта 2019

Похоже, исключение происходит, потому что CDI не находит bean-компонент, аннотированный @Any и @MyAnnotation, потому что тот, который вы хотите выбрать, аннотируется только @MyAnnotation.Я думаю, что @Any не должен быть необходим при внедрении Instance, потому что Instance будет иметь доступ ко всем реализациям MyInterface, при этом вы выбираете тот, который аннотирован @MyAnnotation (MyEnum.value).Я никогда не использовал Instance с квалификатором, который использует перечисление.

Я думаю, вам не нужно использовать Instace.Не работает ли следующая инъекция?

class MyDelegate implements MyInterface{

   @Inject
   @MyAnnotation(MyEnum.value)
   private MyInterface myInterface;
}

Если вам нужно делегировать другую реализацию, возможно, вам нужны CDI-декораторы.

@Decorator
@Default // We decorate the default implementation of MyInterface or any qualified 
         // one you need to decorate
abstract class MyDecorator implements MyInterface {

   @Inject
   @MyAnnotation(MyEnum.value)
   private MyInterface myInterface;

   @Inject
   @Delegate
   private MyInterface delegate;

   // Implement all methods you want to decroate

   public void myMethod(){
      if(condition) {
         myInterface.myMethod();
      } else {
         delegate.myMethod();
      }
   }
}

Вам необходимо зарегистрировать декоратор вyour beans.xml

<decorators>
    <class>MyDecorator</class>
</decorators>    

Вам это поможет?

...