繁体   English   中英

从Ear应用程序中的Web模块(RESTful服务)访问ejb

[英]Access ejb from web module (RESTful services) in ear application

我有一个包含ejb.jar和一个Web应用程序(战争)的Ear应用程序。 ejb.jar包含我所有的EJB(bean和接口),而war包含REST Web服务。 我想从war模块访问EJB,这可能吗? 注入EJB不起作用,我得到了空指针异常。

我知道这个问题已经被问了很多遍了,但是我似乎无法解决这个问题……

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

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

@Path("/user")
public class UserWS
{
    @EJB
    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,该应用程序是一个Java EE应用程序,其中包括一个Web模块(用于战争)。

编辑

我无法避免玻璃鱼从v2升级到v4。 我的所有问题都消失了,这是我做出的最好决定。 我代码中的所有ejb注入都像一个魅力!

谢谢你们的建议! 我接受hugh的回答,因为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();
    }
}

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

根据JAX-RS规范,默认情况下,JAX-RS类中不启用注入。 您或者需要使用CDI bean部署档案(为CDI 1.0添加WEB-INF / beans.xml),使JAX-RS类成为托管bean(向类添加@ManagedBean批注),或者使JAX。 -RS类是EJB(例如,将@Stateless批注添加到该类)。

不会注入该bean,因为此类不是EJB。 您应该能够使用JNDI查找获得副本:

SB_usrRemote bean = (SB_usrRemote) new InitialContext().lookup("SB_usrRemote");

有关JNDI查找的更多信息,请参见: 链接

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM