我的耳朵应用程序包含ejb.jar和Web应用程序(war)。 ejb.jar包含我的所有EJB(bean和接口),而我的war包含REST Web服务。我想从war模块访问EJB,这可能吗?注入EJB不起作用,我得到空指针异常。
我知道这已被多次询问,但我似乎无法让这个工作......
我正在使用Glassfish v2.1.1(我知道我应该升级,但现在很难......)
以下是返回nullPointerException的代码片段: (我知道我不应该通过GET验证用户,但这只是我尝试检查是否可以访问ejb的示例代码)
@Path("/user")
public class UserWS
{
@EJB (lookup = "java:global/<ear-name>/<ejb-jar-name>/SB_usrRemote")
SB_usrRemote sb_usrRemote;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String checkLoginAttempt(String username, String password)
{
return sb_usrRemote.checkLoginAttempt(username, password).toString();
}
}
我没有提到只有当我将ejb.jar包含在ear应用程序的lib文件夹中时,此代码才有效,war文件可以在其中“看到”它。有没有其他方法可以访问EJB类? 我也在使用Intellij,该应用程序是一个包含Web模块的Java EE应用程序(用于战争)。
修改
我无法避免将glassfish从v2升级到v4。这是我做出的最好的决定,因为我的所有问题都消失了。我的代码中的所有ejb注入都像一个魅力!
谢谢你们的建议!我接受了休的答案,因为JNDI可能会起作用,但从长远来看,升级玻璃鱼似乎是一个更合适的解决方案。
编辑2
我终于使用此代码设法进行了正确的ejb注入:
{{1}}
在部署我的ear文件时,我在glassfish日志中找到了正确的查找路径。
答案 0 :(得分:2)
根据JAX-RS规范,JAX-RS类中默认不启用注入。您需要使用CDI bean部署存档(为CDI 1.0添加WEB-INF / beans.xml),使JAX-RS类成为托管bean(将@ManagedBean
注释添加到类中)。或者使JAX-RS类成为EJB(例如,将@Stateless
注释添加到类中。)
答案 1 :(得分:0)
bean没有被注入,因为这个类不是EJB。您应该能够使用JNDI查找获取副本:
SB_usrRemote bean = (SB_usrRemote) new InitialContext().lookup("SB_usrRemote");
有关JNDI查找的更多信息,请访问:link
另一种可能性是使bean成为托管bean - 我认为这在JSF中是可能的,但我担心我不知道这一点。 [编辑 - JAX-RS,而不是JSF,根据Bkail的答案]