使用cdi @Produces和@Inject与限定符的属性

时间:2018-05-12 09:32:58

标签: properties cdi

我试图想出一种易于使用的CDI方式来使用属性。根据几个博客,这是(不工作)结果(抱歉布局无法正确)。

1。 EEProperties(提供者,单独jar):

@Singleton
public class EEProperties extends AbstractPropertiesDecorator {
    @Inject
    public EEProperties(@InjectInEEProperties EnhancedMap properties) {
        super(properties);
    }

    private String[] getKeys(final InjectionPoint ip) {
        return (ip.getAnnotated().isAnnotationPresent(Property.class) && ip.getAnnotated().getAnnotation(Property.class).keys().length>0) ?
            ip.getAnnotated().getAnnotation(Property.class).keys() :
            new String[] {ip.getMember().getName()};
    }

    @Produces
    @Property
    public File[] getFileProperties(InjectionPoint ip) {
        return getFileProperties(null, getKeys(ip));
    }
}

2。 ManagedBean使用者(战争中):

@Inject
@Property(keys = {"test"})
private String test;

第3。 ...也会为提供者生成构造函数参数:

@Produces
@InjectInEEProperties
public EnhancedMap getP() {

    EnhancedMap m = new Settings();
    m.put("test", "cdi works");
    return m;
}

4。 cdi容器的注释:

@Qualifier
@Retention(RUNTIME)
@Target({FIELD,ElementType.METHOD,ElementType.PARAMETER})
public @interface InjectInEEProperties {

   @Nonbinding String key() default "";   
}

5。消费者注释:

@Qualifier
@Retention(RUNTIME)
@Target({FIELD,ElementType.METHOD})
public @interface Property {

   @Nonbinding String[] keys() default {};   
}

6。运行此问题(在payara 5上):

  

引起:java.lang.NullPointerException at   org.glassfish.weld.services.JCDIServiceImpl.createManagedObject(JCDIServiceImpl.java:463)     在   org.glassfish.weld.services.JCDIServiceImpl.createManagedObject(JCDIServiceImpl.java:314)     在   com.sun.enterprise.container.common.impl.managedbean.ManagedBeanManagerImpl.createManagedBean(ManagedBeanManagerImpl.java:476)

我已经尝试了很多东西,但无法实现这一点,包括从ManagedBean中删除@Produces。

1 个答案:

答案 0 :(得分:0)

通过创建一个负责提供构造函数参数的单独类来解决问题:

@Singleton
public class PP {

    @Produces
    @InjectInEEProperties
    public EnhancedMap getP() {
        EnhancedMap m = new Settings();
        m.put("test", "cdi works");
        return m;
    }

}