如何@FacesValidator注入与@EJB,@PersistenceContext,@注入,@Autowired

问题描述 投票:31回答:1

我怎样才能像注入@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也不起作用。

如何注入一个服务依赖于我的验证,这样我可以访问数据库?

spring validation jsf-2 dependency-injection service-layer
1个回答
63
投票

@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注解放在类解决它。

See also:


更新:如果你碰巧使用JSF工具库OmniFaces,因为1.6版本增加了对使用@Inject@EJB@FacesValidator类无需任何额外的配置或注解透明的支持。参见the CDI @FacesValidator showcase example

© www.soinside.com 2019 - 2024. All rights reserved.