Java 从ear应用程序中的web模块(RESTful服务)访问ejb

Java 从ear应用程序中的web模块(RESTful服务)访问ejb,java,rest,glassfish,ejb,ear,Java,Rest,Glassfish,Ejb,Ear,我有一个ear应用程序,它由一个ejb.jar和一个web应用程序(war)组成。 jar包含我的所有ejb(bean和接口),我的war包含RESTWeb服务。我想从war模块访问EJB,这可能吗?注入EJB不起作用,我得到空指针异常 我知道这已经被问了很多次了,但我似乎无法让它工作 我正在使用Glassfish v2.1.1(我知道我应该升级,但现在很难…) 以下是返回nullPointerException的代码片段: (我知道我不应该通过GET验证用户,但这只是一个示例代码,我只是想检查

我有一个ear应用程序,它由一个ejb.jar和一个web应用程序(war)组成。 jar包含我的所有ejb(bean和接口),我的war包含RESTWeb服务。我想从war模块访问EJB,这可能吗?注入EJB不起作用,我得到空指针异常

我知道这已经被问了很多次了,但我似乎无法让它工作

我正在使用Glassfish v2.1.1(我知道我应该升级,但现在很难…)

以下是返回nullPointerException的代码片段: (我知道我不应该通过GET验证用户,但这只是一个示例代码,我只是想检查我是否可以访问ejb)

我没有提到,只有当我将ejb.jar包含在ear应用程序的lib文件夹中,war模块才能“看到”它时,这段代码才起作用。有没有其他方法可以访问EJB类? 我还使用Intellij,该应用程序是一个JavaEE应用程序,包括一个web模块(用于war)

编辑

我无法避免glassfish从v2升级到v4。这是我做的最好的决定,因为我所有的问题都消失了。我的代码中的所有ejb注入都非常有效

谢谢你们两位的建议!我接受休的回答,因为JNDI可能会奏效,但从长远来看,升级glassfish似乎是一个更合适的解决方案

编辑2

我最终成功地使用以下代码进行了适当的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();
    }
}
@Path(“/user”)
公共类用户
{
@EJB(lookup=“java:global///SB_usrRemote”)
某人,你,你,你,你;
@得到
@生成(MediaType.TEXT\u PLAIN)
公共字符串检查登录尝试(字符串用户名、字符串密码)
{
返回sb_usrRemote.checkLoginAttest(用户名、密码).toString();
}
}

部署ear文件时,我在glassfish日志中找到了正确的查找路径。

bean没有被注入,因为该类不是EJB。您应该能够使用JNDI查找获取副本:

SB_usrRemote bean = (SB_usrRemote) new InitialContext().lookup("SB_usrRemote");
有关JNDI查找的更多信息,请参见:


另一种可能性是使bean成为托管bean——我认为这在JSF中是可能的,但我恐怕对此一无所知。[根据Bkail的回答,编辑-JAX-RS,而不是JSF]

根据JAX-RS规范,JAX-RS类中默认不启用注入。您或者需要使用CDIBean部署归档(为CDI 1.0添加WEB-INF/beans.xml),将JAX-RS类设置为托管bean(将
@ManagedBean
注释添加到类中),或者将JAX-RS类设置为EJB(例如,将
@Stateless
注释添加到类中)。

谢谢您的建议,我会试试看,我会让你知道的!也谢谢你的建议,不幸的是没有任何效果,我将尝试升级到glassfish v3并重试…FWIW,Bkail的建议更好。JNDI是一个有效的替代方案,但没有那么整洁。我能问一下这个查找会发生什么吗?如果您得到一个
NameNotFoundException
,我们可能可以通过摆弄您需要查找的内容来解决这个问题。
SB_usrRemote bean = (SB_usrRemote) new InitialContext().lookup("SB_usrRemote");