Я пытаюсь найти простой в использовании способ использования свойств CDI. На основании нескольких блогов это (не работает) результат (извините за разметку, не могу получить это право).
1. EEProperties (поставщик, отдельная банка):
@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. проблема при запуске этого (на паяре 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)
Я много чего пробовал, но не могу заставить это работать, включая удаление @Produces из ManagedBean.