我正在尝试编写一个通用枚举生成器;每个注入点都声明不同的枚举类型,并且值根据其他地方声明的一组值进行解析(不太重要)。
我一直在写通用枚举
@Produces
:
@ApplicationScoped
class MyBean {
@Inject
@EnumProperty
MyEnum myEnumProperty;
@Inject
@EnumProperty
AnotherEnum anotherEnumProperty;
}
@Qualifier
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EnumProperty {
@Nonbinding
public String name() default "";
}
@ApplicationScoped
public GenericEnumProducer {
@Produces @EnumProperty
Enum enumProducer(InjectionPoint ip) {
Field f = (Field) injectionTarget;
Class<Enum<?>> enumClass = (Class<Enum<?>>) f.getType();
return getPropertyFromSystemAndConvertToEnum();
}
@Produces @EnumProperty
Object objectEnumProducer(InjectionPoint ip) {
Field f = (Field) injectionTarget;
Class<Enum<?>> enumClass = (Class<Enum<?>>) f.getType();
return getPropertyFromSystemAndConvertToEnum();
}
@Produces @EnumProperty
<T extends Enum<?>> T genericEnumProducer(InjectionPoint ip) {
Field f = (Field) injectionTarget;
Class<Enum<?>> enumClass = (Class<Enum<?>>) f.getType();
return getPropertyFromSystemAndConvertToEnum();
}
}
我有编译时异常
生产者方法 java.lang.Enum genericEnumProducer(jakarta.enterprise.inject.spi.InjectionPoint ip) 在类 MyBean$GenericEnumProducer 上声明 包含带有通配符的参数化类型。这种类型不是 符合 CDI 规范的合法 bean 类型。
或
类型依赖性不满足 MyBean$MyEnum 和限定符 [@EnumProperty]
- 注入目标:MyBean#value
- 在 CLASS bean 上声明 [types=[MyBean, java.lang.Object], qualifiers=[@Default, @Any], 目标=MyBean]
有什么建议吗?
我认为这可能是示例通用 CDI 生产者方法未按预期工作
您的情况:
public class Wrapper<T extends Enum<T>> {
public final Enum<T> bean;
public Wrapper(Enum<T> bean){
this.bean = bean;
}
}
...
@Produces @EnumProperty
<T extends Enum<T>> Wrapper<T> genericEnumProducer(InjectionPoint ip) {
Field f = (Field) injectionTarget;
Class<Enum<T>> enumClass = (Class<Enum<T>>) f.getType();
return getPropertyFromSystemAndConvertToEnum();
}