【问题标题】:Access ejb from web module (RESTful services) in ear application在 ear 应用程序中从 web 模块(RESTful 服务)访问 ejb
【发布时间】:2015-08-03 08:07:35
【问题描述】:

我有一个由 ejb.jar 和 Web 应用程序 (war) 组成的 ear 应用程序。 ejb.jar 包含我所有的 EJB(bean 和接口),我的战争包含 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 模块(用于战争)。

编辑

我无法避免 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();
    }
}

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

【问题讨论】:

    标签: java rest glassfish ejb ear


    【解决方案1】:

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

    【讨论】:

    • 谢谢你的建议,我会试一试,我会告诉你的!
    【解决方案2】:

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

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

    更多关于 JNDI 查找的信息在这里:link

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

    【讨论】:

    • 也感谢您的建议,不幸的是没有任何效果,我将尝试升级到 glassfish v3 并重试...
    • FWIW,Bkail 的建议要好得多。 JNDI 是一个有效的替代方案,但没有那么简洁。我能问一下这个查找会发生什么吗?如果您收到NameNotFoundException,我们可能可以通过摆弄您需要查找的确切内容来解决此问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    相关资源
    最近更新 更多