如何使用@EJB、@PersistenceContext、@Inject、@Autowired 注入@FacesValidator [英] How to inject in @FacesValidator with @EJB, @PersistenceContext, @Inject, @Autowired

查看:29
本文介绍了如何使用@EJB、@PersistenceContext、@Inject、@Autowired 注入@FacesValidator的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何注入@EJB@PersistenceContext@Inject@AutoWired等依赖项,@FacesValidator 中的等?在我的特定情况下,我需要通过 @AutoWired 注入 Spring 管理的 bean:

How can I inject a dependency like @EJB, @PersistenceContext, @Inject, @AutoWired, etc in a @FacesValidator? In my specific case I need to inject a Spring managed bean via @AutoWired:

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

    @Autowired
    private UserDao userDao;

    // ...
}

然而,它没有被注入,它仍然是null,导致java.lang.NullPointerException.@EJB@PersistenceContext@Inject 似乎也不起作用.

However, it didn't get injected and it remains null, resulting in java.lang.NullPointerException. It seems that @EJB, @PersistenceContext and @Inject also doesn't work.

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

How do I inject a service dependency in my validator so that I can access the DB?

推荐答案

JSF 2.3+

如果您已经使用 JSF 2.3 或更新版本,并且想要通过例如注入 CDI 支持的工件@EJB@PersistenceContext@Inject,然后只需将 managed=true 添加到 @FacesValidator 注释以使其由 CDI 管理.

JSF 2.3+

If you're already on JSF 2.3 or newer, and want to inject CDI-supported artifacts via e.g. @EJB, @PersistenceContext or @Inject, then simply add managed=true to the @FacesValidator annotation to make it CDI-managed.

@FacesValidator(value="emailExistValidator", managed=true)

JSF 2.2-

如果您还没有使用 JSF 2.3 或更新版本,那么您基本上需要将其设为托管 bean.使用 Spring 的 @Component,CDI 的 @Named 或 JSF 的 @ManagedBean 而不是 @FacesValidator 以使其成为托管 bean,从而有资格进行依赖注入.

JSF 2.2-

If you're not on JSF 2.3 or newer yet, then you basically need to make it a managed bean. Use Spring's @Component, CDI's @Named or JSF's @ManagedBean instead of @FacesValidator in order to make it a managed bean and thus eligible for dependency injection.

例如,假设您要使用 CDI 的 @Named:

E.g., assuming that you want to use CDI's @Named:

@Named
@ApplicationScoped
public class EmailExistValidator implements Validator {
    // ...
}

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

You also need to reference it as a managed bean by #{name} in EL instead of as a validator ID in hardcoded string. Thus, so

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

代替

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

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

代替

<f:validator validatorId="emailExistValidator" />

对于 EJB,有一个从 JNDI 手动抓取的解决方法,另见 在@FacesConverter 和@FacesValidator 中获取@EJB.

For EJBs there's a workaround by manually grabbing it from JNDI, see also Getting an @EJB in @FacesConverter and @FacesValidator.

如果您碰巧使用 JSF 实用程序库 OmniFaces,自 1.6 版以来,它添加了对使用 @ 的透明支持将@EJB 注入到@FacesValidator 类中,无需任何额外的配置或注释.另请参阅CDI @FacesValidator 展示示例.

If you happen to use JSF utility library OmniFaces, since version 1.6 it adds transparent support for using @Inject and @EJB in a @FacesValidator class without any additional configuration or annotations. See also the CDI @FacesValidator showcase example.

这篇关于如何使用@EJB、@PersistenceContext、@Inject、@Autowired 注入@FacesValidator的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆