当前位置: 首页 > 知识库问答 >
问题:

使用焊接CDI注入任意枚举

柯学
2023-03-14

我试图提供一个机会注入任意枚举给定的注入点和字符串值(这是在生产方法中获得)

任意是指如果我有枚举我的和枚举你的,我想用相同的生产者方法注入它们两个或任何其他一个。

所以我尝试了几种方法: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。焊接例外情况。DeploymentException:WELD-001408:在注入点[BackedAnnotatedField]@Inject@X pathToMyField]处带有限定符@X的TestEnum类型的未满足依赖性。测试员2

那么,有没有办法创建一个能够生成任意枚举的products方法呢。

共有1个答案

杜苏燕
2023-03-14

您将需要实例和限定符的独特组合,因为没有限定符,weld不知道调用哪个生产者。

有一种实现动态枚举绑定的方法,我在本文的评论中找到了: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选择正确的生产者方法。

既然您需要一个额外的限定符,其中包含您要注入的枚举的名称,那么为什么要注入呢?

 类似资料:
  • 有一个简单的Mongo DB生产者连接到Mongo数据库 我的src/main/resources/meta-inf中的一个资源文件 WeldContext和WeldJUnit4Runner来自这里-http://memorynotfound.com/java-se-unit-testing-cdi-junit-jboss-weld-se/

  • 像这样上课: 有没有可能告诉Weld不要注射到c中?我可以否决使用事件的类: 但是B物体也不会被注射。我在搜索类似这样的东西:“如果类名是A,字段类型是C,那么省略注入。” 更具体地说,我希望HK2引擎注入“C”字段,问题是HK2和焊接都使用@注入注释。 我尝试了西利亚罗斯的解决方案。我找到了想要添加自定义注入实现的类型,比如: 在我添加了覆盖注入(…)在美国 比如: 在Manager eBVia

  • 我正在学习jboss Weld Event教程中的Weld Event,我想写一个观察事件并在事件被激发时打印helloword的示例。 这是我的代码: 它不起作用,给出以下异常信息: 容器中似乎没有可以初始化的bean 那么我该怎么做才能使它运行,我的beans.xml是空的 也许我应该在beans.xml中做些什么? 或者我应该编写一个实现事件接口的Java类? 任何内容都将适用。

  • 问题内容: 比方说,我有一个名为接口,以及三种实现- ,和。 现在,我希望每当我的托管bean(或任何Web组件)收到一条消息时,便在所有社交网络中共享它。我试过了: 但这没有用(部署错误)。(也尝试了预选赛-同样的结果) 那么,有没有办法注入接口的所有(或某些)实现的列表? 我知道给定注入点不应包含多个可能的bean的规则。我想我可以通过创建一个产生列表的生产者并使用来实现这一点,但这对于这项任

  • 问题内容: 当前,我正在使用PersistenceContext注入EntityManager。EM被完美注入。 现在,我尝试装饰Bean,然后突然没有注入em。我得到一个NullPointerException。 我知道EJB和CDI是2个完全不同的管理器,所以一个都不知道另一个。我期望@PersistenceContext是EJB注入点,而@Inject是CDI。我应该怎么做才能解决这个问题并

  • 问题内容: 我试图将在Spring上下文中定义的bean注入到CDI托管组件中,但没有成功。不会注入Bean,而是在每次执行注入时都会创建一个新实例。我的环境是带有JBoss Weld的Tomcat 7。 Spring ApplicationContext很简单: CDI托管bean如下所示: 这是我的 但是,当我从JSF页面访问属性时,每次访问时都会创建一个新实例。这是一个简单的示例: 我得到以