@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
.