如何使用@EJB、@PersistenceContext、@Inject、@Autowired 注入@FacesValidator [英] How to inject in @FacesValidator with @EJB, @PersistenceContext, @Inject, @Autowired
问题描述
如何注入@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屋!