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

Mah*_*leh 31 validation spring dependency-injection service-layer jsf-2

我怎么可以注入的依赖一样@EJB,@PersistenceContext,@Inject,@AutoWired,等的@FacesValidator?在我的具体情况下,我需要通过以下方式注入Spring托管bean @AutoWired:

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

    @Autowired
    private UserDao userDao;

    // ...
}
Run Code Online (Sandbox Code Playgroud)

然而,它没有被注射,它仍然存在null,导致java.lang.NullPointerException.看来@EJB,@PersistenceContext并且@Inject也不起作用.

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

Bal*_*usC 63

@FacesValidator不被注入容器管理.您需要将其设置为托管bean.使用Spring @Component,CDI @Named或JSF @ManagedBean而不是@FacesValidator为了使它成为托管bean,因此有资格进行依赖注入.

例如,假设您要使用JSF @ManagedBean:

@ManagedBean
@RequestScoped
public class EmailExistValidator implements Validator {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

您还需要#{name}在EL中将其作为托管bean引用,而不是在硬编码字符串中作为验证器ID 引用.因此,如此

<h:inputText ... validator="#{emailExistValidator.validate}" />
Run Code Online (Sandbox Code Playgroud)

要么

<f:validator binding="#{emailExistValidator}" />
Run Code Online (Sandbox Code Playgroud)

代替

<h:inputText ... validator="emailExistValidator" />
Run Code Online (Sandbox Code Playgroud)

要么

<f:validator validatorId="emailExistValidator" />
Run Code Online (Sandbox Code Playgroud)

这确实很尴尬.JSF人员证实了这种令人尴尬的疏忽,他们将在即将到来的JSF中成为@FacesValidator(和@FacesConverter)合格的注射目标2.22.3,另见JSF规范问题763.对于EJB,可以通过从JNDI手动获取它来解决此问题,另请参阅在@FacesConverter和@FacesValidator中获取@EJB.如果您碰巧使用CDI扩展MyFaces CODI,那么您也可以通过@Advanced在类上添加注释来解决它.

也可以看看:


更新:如果您碰巧使用JSF实用程序库OmniFaces,因为版本1.6增加了对使用@Inject@EJB@FacesValidator类中的透明支持,而无需任何其他配置或注释.另请参阅CDI @FacesValidator展示示例.

  • 一个对变化敏感的实例变量,已由一个或多个方法使用.例如`public class FooDAO {private bar bar; 这里,`bar`是`FooDAO`类的状态.如果它在会话或应用程序范围中并且一个请求更改它,那么它将反映在所有其他请求/会话上.这可能不是理想的.在这种情况下,您应该将其保留在请求范围内,以便所有其他请求/会话不共享它.但是如果它不保持状态并且所有工作都是基于同一方法块内的变量完成的,那么您可以安全地放入会话/应用范围. (3认同)
  • 1)对不起,我不做春天.我做EJB并了解CDI.但我真的不能进入Spring的细节.2)因为您不想在不同请求之间共享DAO状态.3)`binding`需要EL范围内的任何具体实例(由`@ManagedBean`或`@ Named`编写).`validatorId`需要一个`@ FacesValidator` id(但是因为我们删除它,它不再存在). (2认同)
  • 如果DAO是无状态的(即没有任何字段/属性),那么您可以安全地将其保持在广泛的范围内.但如果它是有状态的(即有任何对基于请求的更改敏感的字段/属性),那么您更愿意将其保留在请求范围内. (2认同)