一尘不染

如何使用@ EJB,@ PersistenceContext,@ Inject,@ Autowired注入@FacesValidator

spring

我怎样才能像注入的依赖@EJB@PersistenceContext@Inject@AutoWired,等的@FacesValidator?在我的特定情况下,我需要通过以下方式注入Spring托管的bean @AutoWired

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

    @Autowired
    private UserDao userDao;

    // ...
}

但是,它没有注入,而是保留了null,导致java.lang.NullPointerException。似乎@EJB@PersistenceContext并且@Inject也不起作用。

如何在验证器中注入服务依赖项,以便可以访问数据库?


阅读 555

收藏
2020-04-11

共1个答案

一尘不染

@FacesValidator不被注入容器管理。你需要使其成为托管bean。使用Spring @Component,CDI @Named或JSF @ManagedBean代替,@FacesValidator以便使其成为托管bean,从而有资格进行依赖项注入。

例如,假设你要使用JSF @ManagedBean

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

你还需要通过#{name}EL 将其作为托管bean进行引用,而不是作为硬编码字符串中的验证器ID 进行引用。这样

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

要么

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

代替

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

要么

<f:validator validatorId="emailExistValidator" />

这确实很尴尬。JSF伙计们已经证实了这一令人尴尬的监督,他们将使@FacesValidator(和@FacesConverter)合格的目标成为即将到来的JSF。2.22.3,另请参阅JSF规范发行763。对于EJB,有一种解决方法,可以从JNDI手动获取它,另请参见在@FacesConverter和@FacesValidator中获取@EJB。如果碰巧使用了CDI扩展MyFaces CODI,那么你也可以通过@Advanced在类上添加注释来解决它。

2020-04-11