我怎样才能像注入@EJB
,@PersistenceContext
,@Inject
,@AutoWired
等在@FacesValidator
的依赖?在我的特定情况下,我需要通过@AutoWired
注入一个Spring管理的bean:
@FacesValidator("emailExistValidator")
public class EmailExistValidator implements Validator {
@Autowired
private UserDao userDao;
// ...
}
但是,它没有得到注入,它仍然null
,导致java.lang.NullPointerException
。看来,@EJB
,@PersistenceContext
和@Inject
也不起作用。
如何注入一个服务依赖于我的验证,这样我可以访问数据库?
该@FacesValidator
不被注入容器管理。你需要使它成为托管bean。使用Spring的@Component
,CDI的@Named
或JSF的@ManagedBean
而不是@FacesValidator
,以使它成为一个托管bean,并因此有资格依赖注入。
例如,假设你要使用JSF的@ManagedBean
:
@ManagedBean
@RequestScoped
public class EmailExistValidator implements Validator {
// ...
}
您还需要通过#{name}
在EL而不是作为硬编码字符串一个验证ID来引用它为管理bean。因此,所以
<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 issue 763。对于EJB有一个变通方法从JNDI手动抓住它,又见Getting an @EJB in @FacesConverter and @FacesValidator。如果你碰巧使用了CDI扩展MyFaces CODI,那么你也可以通过把@Advanced
注解放在类解决它。
更新:如果你碰巧使用JSF工具库OmniFaces,因为1.6版本增加了对使用@Inject
和@EJB
在@FacesValidator
类无需任何额外的配置或注解透明的支持。参见the CDI @FacesValidator
showcase example。