如何在同一个 ear 项目中从一个项目访问到另一个项目的本地接口



我有一个包含 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

查看服务器日志。一个有点不错的 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 开始,您应该能够在@FacesValidator(和@FacesConverter)中注入@EJB

另请参阅:

  • 如何在@EJB、@PersistenceContext、@Inject@Autowired@FacesValidator中注射

最新更新