Mah*_*leh 31 validation spring dependency-injection service-layer jsf-2
我怎么可以注入的依赖一样@EJB
,@PersistenceContext
,@Inject
,@AutoWired
,等的@FacesValidator
?在我的具体情况下,我需要通过以下方式注入Spring托管bean @AutoWired
:
@FacesValidator("emailExistValidator")
public class EmailExistValidator implements Validator {
@Autowired
private UserDao userDao;
// ...
}
Run Code Online (Sandbox Code Playgroud)
然而,它没有被注射,它仍然存在null
,导致java.lang.NullPointerException
.看来@EJB
,@PersistenceContext
并且@Inject
也不起作用.
如何在验证器中注入服务依赖项以便我可以访问数据库?
Bal*_*usC 63
在@FacesValidator
不被注入容器管理.您需要将其设置为托管bean.使用Spring @Component
,CDI @Named
或JSF @ManagedBean
而不是@FacesValidator
为了使它成为托管bean,因此有资格进行依赖注入.
例如,假设您要使用JSF @ManagedBean
:
@ManagedBean
@RequestScoped
public class EmailExistValidator implements Validator {
// ...
}
Run Code Online (Sandbox Code Playgroud)
您还需要#{name}
在EL中将其作为托管bean引用,而不是在硬编码字符串中作为验证器ID 引用.因此,如此
<h:inputText ... validator="#{emailExistValidator.validate}" />
Run Code Online (Sandbox Code Playgroud)
要么
<f:validator binding="#{emailExistValidator}" />
Run Code Online (Sandbox Code Playgroud)
代替
<h:inputText ... validator="emailExistValidator" />
Run Code Online (Sandbox Code Playgroud)
要么
<f:validator validatorId="emailExistValidator" />
Run Code Online (Sandbox Code Playgroud)
这确实很尴尬.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
展示示例.
归档时间: |
|
查看次数: |
12564 次 |
最近记录: |