在耳朵应用程序中从Web模块(RESTful服务)访问ejb

时间:2015-08-03 08:07:35

标签: java rest glassfish ejb ear

我的耳朵应用程序包含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日志中找到了正确的查找路径。

2 个答案:

答案 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的答案]