我试图想出一种易于使用的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。
答案 0 :(得分:0)
通过创建一个负责提供构造函数参数的单独类来解决问题:
@Singleton
public class PP {
@Produces
@InjectInEEProperties
public EnhancedMap getP() {
EnhancedMap m = new Settings();
m.put("test", "cdi works");
return m;
}
}