2013-10-07 3 views
2

У меня создалось впечатление, что CDI не работает с классами, у которых есть @javax.faces.component.FacesComponent. Это правда?@ Inject-ed значение null в @FacesComponent

Вот мой пример, который не работает. MyInjectableClass используется в других точках кода, где инъекция не является проблемой, поэтому она должна быть около анкеты @FacesComponent, я думаю.

Класс Я хочу, чтобы впрыснуть:

@Named 
@Stateful 
public class MyInjectableClass implements Serializable { 

    private static final long serialVersionUID = 4556482219775071397L; 
} 

компонент, который использует этот класс;

@FacesComponent(value = "mycomponents.mytag") 
public class MyComponent extends UIComponentBase implements Serializable { 

    private static final long serialVersionUID = -5656806814384095309L; 

    @Inject 
    protected MyInjectableClass injectedInstance; 


    @Override 
    public void encodeBegin(FacesContext context) throws IOException { 
     /* injectedInstance is null here */ 
    } 
} 

ответ

10

К сожалению, даже для JSF 2.2 @FacesComponent, @FacesValidator и @FacesConverter не являются действительными целями инъекции (чтение What's new in JSF 2.2? по Арьянам Tijms для более подробной информации). Как отмечает Арьян,

Скорее всего, это будет учтено для JSF 2.3.

Что вы можете сделать? Ну, у вас есть в основном два варианта:

  1. Handle CDI injection via lookup, или переключиться на EJB и сделать simpler EJB lookup;
  2. Аннотировать тур класса с @Named вместо @FacesComponent, @Inject компонент, как вы это делали, и register your component in faces-config.xml.

И, кстати, у вас есть две проблемы с тем, что вы получили это далеко: (1) то, что подразумевается под @Named @Stateful, когда бывший от мира, КДИ и последний из EJB мира и (2) уверены, что вы намерены сохранить состояние в компоненте лиц, который в основном воссоздается по каждому запросу?

+3

Вы действительно испытали # 2? Экземпляр компонента пользовательского интерфейса создается через JSF 'Application # createComponent()', а не через CDI. Таким образом, вам также нужна индивидуальная реализация «Application» (точно так же, как OmniFaces для этих преобразователей/валидаторов). – BalusC

1

@FacesCompnent управляется JSF и инъекции не поддерживается в них.

Смежные вопросы