通用枚举 bean 生产者

问题描述 投票:0回答:1

我正在尝试编写一个通用枚举生成器;每个注入点都声明不同的枚举类型,并且值根据其他地方声明的一组值进行解析(不太重要)。
我一直在写通用枚举

@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]

有什么建议吗?

java quarkus cdi
1个回答
0
投票

我认为这可能是示例通用 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();
   }
© www.soinside.com 2019 - 2024. All rights reserved.