Можно ли внедрить bean-компонент в PhaseListener при использовании JSF 2.3, tomcat с реализацией Weld CDI?

Я хочу внедрить bean-компоненты @SessionScoped и @RequestScoped в свою реализацию PhaseListener, но у меня получилось NullPointerException.

Я использую tomcat с реализацией сварки для достижения CDI. Я начал переходить с JSF 2.2 на 2.3, поэтому перешел с FacesContext на CDI. Ну, я заменил @ManagedBean на @Named и любые другие вещи, которые необходимо сделать во время миграции, такие как: - добавить XML bean-компонентов в каждый модуль - добавить BeanManager в XML-контекст - удалить объявления bean-компонентов из Faces-config.xml - добавить SPI BeanManager как resource-env-ref в web.xml Как я могу внедрить любой bean-компонент в PhaseListener реализации?

@Named
@SessionScoped
public class MyHandler implements Serializable {    
..}

@Named
@RequestScoped
public class MyController extends MyParentController<Example> {
..}

public class MyPhaseListener implements PhaseListener {

private MyHandler myHandler;
private MyController myController;

@Inject
public void setMyHandler(MyHandler myHandler) {
    this.myHandler= myHandler;
}

@Inject
public void setMyController (MyController myController) {
    this.myController= myController;
}
...

public void afterPhase(PhaseEvent event) {
myHandler.method()
}

myHandler введенный bean-компонент имеет значение null в методе afterPhase.


person BravoNine    schedule 31.01.2019    source источник
comment
Я думаю, что это не дублированный вопрос. Я спросил об инъекции в JSF 2.3, а не в JSF 2.2. Моя цель - исключить весь код, который получает bean-компонент из контекста через выражение EL.   -  person BravoNine    schedule 31.01.2019
comment
Вы пробовали инъекцию поля?   -  person Kukeltje    schedule 31.01.2019
comment
В stackoverflow.com/questions/19930241/ BalusC предполагает, что он должен работать с JSF 2.2, но я не смог @Inject что-то добавить в Phaselistener с помощью внедрения полей (используя openWebbeans, Mojarra 2.3, CDI API 2.0). Отменил мой флаг дублирования, и меня интересует решение. Поэтому проголосовал.   -  person Selaron    schedule 31.01.2019
comment
@BravoNine Лучше всего поместить свой ответ в ответ и отметить его как принятый, чтобы помочь другим;)   -  person Steven De Groote    schedule 04.02.2019


Ответы (2)


  1. Я поместил файл конфигурации CDI beans.xml в папку META-INF вместо WEB-INF
  2. В beans.xml мне пришлось изменить bean-discovery-mode с «аннотированных» на «все».
  3. Я забыл добавить класс с аннотацией @FacesConfig(version = Version.JSF_2_3) (чтобы включить разрешение EL для компонентов CDI).
  4. Так же забыл поменять faces-config.xml версию на 2.3
person erickdeoliveiraleal    schedule 14.03.2019

К счастью, я решил проблему... Несколько вещей, которые мне нужно было сделать:

  1. Я поместил beans.xml в META-INF/, но beans.xml должен быть в WEB-INF.
  2. В beans.xml мне пришлось изменить режим bean-discovery с «аннотированного» на «все».
  3. Я забыл добавить класс с аннотацией @FacesConfig(version = Version.JSF_2_3) (чтобы включить разрешение EL для компонентов CDI).
  4. Также забыл изменить версию Faces-config.xml на 2.3.
person BravoNine    schedule 04.02.2019