2015-05-25 2 views
0

Я пытаюсь предоставить возможность придать произвольное перечисление заданной точки впрыска и строковое значение (что получается в Выдает метод)Инъекционное произвольное перечисление с WELD КДИ

Произвольные средства, если у меня есть перечисление My и ENUM Your I хотели бы добавить оба из них или любого другого с тем же способом изготовления.

Так что я попробовал несколько подходов: 1.

@Produces 
@MyConfigAnnotation 
Enum getArbitraryEnum(InjectionPoint point) { 
    ... 
    // get string representation, 
    // instantiate enum using point 
    return Enum.valueOf((Class<Enum>)injectionPoint.getAnnotated().getClass(), enumValue); 
} 

2. Я изменил тип возвращаемого значения для объекта.

В обеих случаях я получаю следующее исключение вызваны следующими причинами: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Неудовлетворённые зависимости для типа TestEnum с отборочными @X в точке инъекции [BackedAnnotatedField] @Inject @X pathToMyField .testEnum2

Итак, есть ли способ создать метод Produces, который сможет произвести произвольное перечисление.

+0

Можете ли вы предоставить больше своего метода производителя? Какой контейнер вы используете? –

+0

@JohnAment Я добавил способ, которым я пытаюсь создать экземпляр enum. Но это вряд ли имеет значение, так как кажется, что приложение не приходит в метод. Что касается контейнера, я использую Jboss Weld, или вы имели в виду что-то другое? – Anjenson

ответ

-1

Вам нужно будет иметь уникальные комбинации экземпляра и квалификатора, так как без квалификатора сварка не знает, какого производителя звонить.

Существует способ достижения динамического перечисления связывания, я нашел его в комментариях этой статьи: http://www.ocpsoft.org/java/how-to-inject-enum-values-into-cdi-beans/

public class InjectedObject { 
    private MyEnum e1; 
    private MyEnum e2; 
    private MyEnum e3; 

    @Inject 
    public InjectedObject(@Config("ONE") MyEnum e1, @Config("TWO") MyEnum e2,  @Config("THREE") MyEnum e3) { 
     this.e1 = e1; 
     this.e2 = e2; 
     this.e3 = e3; 
    } 


    /** 
    * A producer is required in order to {@link Inject} an Enum 
    */ 
    @Produces 
    @Config 
    public static MyEnum getEnum(InjectionPoint ip) { 
     String name = null; 

     /** 
     * Iterate over all Qualifiers of the Injection Point to find our configuration and save the config value 
     */ 
     for(Annotation a : ip.getQualifiers()) { 
      if(a instanceof Config) { 
       name = ((Config) a).value(); 
      } 
     } 

     /** 
     * Iterate over all enum values to match them against our configuration value 
     */ 
     for(MyEnum me : MyEnum.values()) { 
      if(me.toString().equals(name)) { 
       return me; 
      } 
     } 

     return null; 
    } 

    /** 
    * Our enum 
    */ 
    public enum MyEnum {  ONE, TWO, FOO } 

    @Qualifier 
    @Target({ TYPE, METHOD, PARAMETER, FIELD }) 
    @Retention(RUNTIME) 
    @Documented 
    public @interface Config { 
     @Nonbinding String value() default ""; 
    } 
} 

Интересная часть конечно пользовательский Классификатор с рекомендательным значением, в результате чего CDI выбрать правильный метод изготовления.

Это все сказано ... так как вам нужен дополнительный квалификатор, который каким-то образом содержит имя перечисления, которое вы хотите ввести ... зачем вообще вводить?

+0

Извините за вводящий в заблуждение код, но я действительно использую квалификатор (отредактированный вопрос). Конечно, спасибо за ответ, но ключевое слово вопроса - ** произвольное ** перечисление. Это означает, что всякий раз, когда вводится enum, он вводится одним и тем же способом производителя. Однако в вашем примере вы создаете точный класс перечисления MyEnum – Anjenson

Смежные вопросы