我怎样才能像注入的依赖@EJB,@PersistenceContext,@Inject,@AutoWired,等的@FacesValidator?在我的特定情况下,我需要通过以下方式注入Spring托管的bean @AutoWired:
@EJB
@PersistenceContext
@Inject
@AutoWired
@FacesValidator
bean @AutoWired
@FacesValidator("emailExistValidator") public class EmailExistValidator implements Validator { @Autowired private UserDao userDao; // ... }
但是,它没有注入,而是保留了null,导致java.lang.NullPointerException。似乎@EJB,@PersistenceContext并且@Inject也不起作用。
java.lang.NullPointerException
@Injec
如何在验证器中注入服务依赖项,以便可以访问数据库?
在@FacesValidator不被注入容器管理。你需要使其成为托管bean。使用Spring @Component,CDI @Named或JSF @ManagedBean代替,@FacesValidator以便使其成为托管bean,从而有资格进行依赖项注入。
@Component
@ManagedBean
例如,假设你要使用JSF @ManagedBean:
@ManagedBean @RequestScoped public 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伙计们已经证实了这一令人尴尬的监督,他们将使@FacesValidator(和@FacesConverter)合格的目标成为即将到来的JSF。2.22.3,另请参阅JSF规范发行763。对于EJB,有一种解决方法,可以从JNDI手动获取它,另请参见在@FacesConverter和@FacesValidator中获取@EJB。如果碰巧使用了CDI扩展MyFaces CODI,那么你也可以通过@Advanced在类上添加注释来解决它。
@FacesConverter