猿问

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

如何使用@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也不起作用。

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


LEATH
浏览 817回答 1
1回答

达令说

在@FacesValidator不被注入容器管理。您需要将其设置为托管bean。使用Spring&nbsp;@Component,CDI&nbsp;@Named或JSF&nbsp;@ManagedBean而不是@FacesValidator为了使它成为托管bean,因此有资格进行依赖注入。例如,假设您要使用JSF&nbsp;@ManagedBean:@ManagedBean@RequestScopedpublic&nbsp;class&nbsp;EmailExistValidator&nbsp;implements&nbsp;Validator&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;...}您还需要#{name}在EL中将其作为托管bean引用,而不是在硬编码字符串中作为验证器ID&nbsp;引用。因此,如此<h:inputText&nbsp;...&nbsp;validator="#{emailExistValidator.validate}"&nbsp;/>要么<f:validator&nbsp;binding="#{emailExistValidator}"&nbsp;/>代替<h:inputText&nbsp;...&nbsp;validator="emailExistValidator"&nbsp;/>要么<f:validator&nbsp;validatorId="emailExistValidator"&nbsp;/>这确实很尴尬。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&nbsp;@FacesValidator展示示例。
随时随地看视频慕课网APP
我要回答