我试图提供一个注入任意枚举的机会,给定注入点和字符串值(在Produces方法中获得)
任意意味着如果我有枚举我和枚举你我想用相同的制作方法注入它们或任何其他的。
所以我尝试了几种方法: 1。
@Produces
@MyConfigAnnotation
Enum getArbitraryEnum(InjectionPoint point) {
...
// get string representation,
// instantiate enum using point
return Enum.valueOf((Class<Enum>)injectionPoint.getAnnotated().getClass(), enumValue);
}
2。我将返回类型更改为Object。
在这两种情况下,我都会收到下一个例外 引起:org.jboss.weld.exceptions.DeploymentException:WELD-001408:类型为TestEnum的依赖项不满意,注入点带有限定符@X [BackedAnnotatedField] @Inject @X pathToMyField.testEnum2
有没有办法创建一个能够生成任意枚举的Produces方法。
答案 0 :(得分:-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选择正确的生成方法。
所有人都说...因为你需要一个额外的限定符,它以某种方式包含你要注入的枚举的名称...为什么要注入?