свойства с использованием cdi @Produces и @Inject с квалификаторами - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь найти простой в использовании способ использования свойств 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.

1 Ответ

0 голосов
/ 12 мая 2018

Решил проблему, создав отдельный класс, отвечающий за предоставление аргумента конструктора:

@Singleton
public class PP {

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...