为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用@EJB,@ PersistenceContext,@ Inject,@ Autowired

如何使用@EJB,@ PersistenceContext,@ Inject,@ Autowired

LEATH 2019-08-13 16:25:37
如何使用@EJB,@ PersistenceContext,@ Inject,@ Autowired注入@FacesValidator我怎么可以注入的依赖一样@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也不起作用。如何在验证器中注入服务依赖项以便我可以访问数据库?
查看完整描述

1 回答

?
达令说

TA贡献1821条经验 获得超6个赞

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

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

@ManagedBean@RequestScopedpublic 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人员证实了这种令人尴尬的疏忽,他们将在即将到来的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展示示例


查看完整回答
反对 回复 2019-08-13
  • 1 回答
  • 0 关注
  • 766 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信