我有一个具有FacesValidator的Web项目,此验证程序需要访问EJB服务以验证是否存在记录。不幸的是,我无法注入我的企业bean,因为验证器不是托管bean,所以我试图通过InitialContext访问它。我尝试了http://docs.oracle.com/javaee/6/tutorial/doc/gipjf.html的不同组合,但失败了。
这种格式有用:
java:global/myProject-ear-1.0.0/myProject/MyService!com.czetsuya.myProject.service.membership.MyService,
我的问题是它可以简化吗?似乎太长了。
谢谢,
czetsuya
答案 0 :(得分:4)
查看服务器日志。有点像样的EJB容器(至少,Glassfish 3和JBoss 6/7),在EJB部署步骤中记录EJB的所有可用JNDI名称。如果验证器已正确放入WAR并且EJB具有@Local
接口,那么最短的JNDI名称将是java:app
名称,在您的情况下应为java:app/myProject/MyService
。
完全不同的替代方法是将验证器改为JSF或CDI托管bean,这样您就可以使用@EJB
注释。
@ManagedBean // Or @Named.
@ApplicationScoped // Provided that the instance doesn't have any state.
public class MyValidator implements Validator {
@EJB
private MyService myService;
// ...
}
并通过binding
而不是validatorId
引用它:
<f:validator binding="#{myValidator}" />
请注意,从JSF 2.2开始,您应该能够在@EJB
(和@FacesValidator
)中注入@FacesConverter
。