Как добавить в @FacesValidator с помощью @EJB, @PersistenceContext, @Inject, @Autowired - PullRequest
31 голосов
/ 27 сентября 2011

Как я могу ввести зависимость типа @EJB, @PersistenceContext, @Inject, @AutoWired и т. Д. В @FacesValidator? В моем конкретном случае мне нужно внедрить управляемый компонент Spring с помощью @AutoWired:

@FacesValidator("emailExistValidator")
public class EmailExistValidator implements Validator {

    @Autowired
    private UserDao userDao;

    // ...
}

Однако, он не был введен и остается null, в результате чего java.lang.NullPointerException. Кажется, что @EJB, @PersistenceContext и @Inject также не работают.

Как добавить сервисную зависимость в мой валидатор, чтобы я мог получить доступ к БД?

1 Ответ

63 голосов
/ 27 сентября 2011

@FacesValidator не управляется контейнером для инъекций.Вы должны сделать это управляемым бобом.Используйте Spring @Component, CDI @Named или JSF @ManagedBean вместо @FacesValidator, чтобы сделать его управляемым компонентом и, таким образом, иметь право навнедрение зависимости.

Например, при условии, что вы хотите использовать JSF @ManagedBean:

@ManagedBean
@RequestScoped
public class EmailExistValidator implements Validator {
    // ...
}

Вы также должны ссылаться на него как на управляемый компонент с помощью #{name} в EL, а не какидентификатор валидатора в жестко закодированной строке.Таким образом,

<h:inputText ... validator="#{emailExistValidator.validate}" />

или

<f:validator binding="#{emailExistValidator}" />

вместо

<h:inputText ... validator="emailExistValidator" />

или

<f:validator validatorId="emailExistValidator" />

Это действительно неловко.Ребята из JSF подтвердили этот неловкий недосмотр, и они сделают @FacesValidator@FacesConverter) приемлемой целью для инъекций в предстоящем JSF 2.2 2.3, см. Также JSF spec проблема 763 ,Для EJB есть обходной путь, вручную извлекая его из JNDI, см. Также Получение @EJB в @FacesConverter и @ FacesValidator .Если вы используете расширение CDI MyFaces CODI , то вы также можете решить эту проблему, добавив @Advanced аннотацию к классу.

См. Также:


Обновление : если вы используете библиотеку утилит JSF OmniFaces , поскольку в версии 1.6 добавлена ​​прозрачная поддержка использования @Inject и @EJB в классе @FacesValidator без какой-либо дополнительной настройки или аннотаций.См. Также пример витрины CDI @FacesValidator .

...