【问题标题】:How to expose an EJB 3.1 as a REST Web Service?如何将 EJB 3.1 公开为 REST Web 服务?
【发布时间】:2012-04-10 15:33:27
【问题描述】:

在阅读Adam Bien's 博客上的一篇文章时,我在使用 EJB 3.1 时发现了 java restful 的一个新特性。

问题是无状态和单例 bean 可以作为根资源公开。但是怎么做? 我试着这样做:

@Stateless
@LocalBean
@Path("Hybrid")
public class RESTEJBSample {

    @GET
    @Path("/demo")
    @Produces(MediaType.TEXT_PLAIN)
    public String something() {
        return "I am a Hybrid!!!";
    }

}

当我调用 URL http://localhost:8080/HybridSample/resources/Hybrid/demo 时,我收到 404 错误。

为了确保 JAXRS 在我的项目中正常工作,我创建了一个简单的 pojo 资源来测试它是否正常工作。

@Path("/genericresource")
public class GenericResource {
    @GET
    @Path("/samplemethod")
    @Produces(MediaType.TEXT_PLAIN)
    public String saySomething() {
        return "Something!";
    }
}

在这里,当我调用 URL http://localhost:8080/HybridSample/resources/genericresource/samplemethod 它工作正常!

所以我的问题是:

  • 我的 EJB 中缺少什么以便它可以像 GenericResource 类那样作为 Web 服务资源工作?

  • 是否需要一些额外的配置?

  • 将 EJB 用作 Web 服务有哪些限制?

【问题讨论】:

    标签: java web-services http ejb jax-rs


    【解决方案1】:

    根据这个NetBeans tutorial about Jersey RESTFul web services,你可以决定是否要

    创建javax.ws.rs.core.Application的子类,所有Rest资源 将由此类自动注册(Java EE 6)

    在 web.xml 中创建默认 Jersey REST servlet 适配器。

    我一直使用第二种选择,即把它添加到你的web.xml

    <servlet>
        <servlet-name>ServletAdaptor</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletAdaptor</servlet-name>
        <url-pattern>/resources/*</url-pattern>
    </servlet-mapping>
    

    根据我的经验,将 REST Web 服务公开为 EJB 非常有用。你可以在任何你喜欢的地方注入它,你可以在其中注入你的 EntityManager,你甚至可以在一些简单的情况下将它用作 DAO。

    关于您关于特性和限制的问题/评论:企业 bean 在 EJB 容器中运行,无论它们是否部署在 war 文件中。您可以将 JMS ConnectionFactory 作为资源注入其中,如 Java EE 6 教程的 this section 中所述。多亏了 ConnectionFactory 的注入,您可以发送 JMS 消息。如果要异步接收 JMS 消息,则需要定义一个消息驱动 Bean,如上述教程的this section 中所述。 我从未尝试扩展用于 Jersey Web 服务的相同 EJB 以实现 MessageListener 接口,但我认为这也应该是可能的(如果没有,您可以将 MDB 注入您的 Jersey 根无状态 bean)。

    最后,您可以按照here 的说明使用容器管理事务。而且,来自this NetBeans tutorial

    为了让你可以看到应用程序将使用 Java 事务 API (JTA) (transaction-type="JTA")。这指定了 管理实体生命周期的责任 持久化上下文被分配给容器。

    <persistence-unit name="em" transaction-type="JTA">
    

    【讨论】:

    • 好,我不知道第一个 :) web.xml 选项也是我的最爱,目前我的 web.xml 看起来已经这样了。我还使用了 Netbeans IDE New-&gt;Webservice 并按照向导勾选了一个选项,上面写着将 Web 服务创建为无状态 bean。将 EJB 添加到 .war 文件中,现在它可以正常工作了。我的示例现在运行良好,但我也想知道幕后发生了什么?Net Beans 正在编辑哪些文件?还有这个bean的限制是什么?是的,我认为这也是一个非常酷的功能。
    • NetBeans 没有添加任何东西:您唯一需要做的就是创建无状态类(在您的示例中为 RESTEJBSample)和 web.xml 中的 servlet 适配器。 servlet 在幕后做所有的事情。关于限制,我认为您应该尝试澄清一下您的问题。
    • 当我提到限制时,我的意思是。这些 bean 是否能够以与部署在 EJB 模块中时相同的方式运行?我的意思是是否需要某种手动事务管理?它们可以与 JMS 交互吗?...现在它们不在 EJB 容器中,它们在 .war 文件中。
    • @perissf 您好 Perissf,请解决我的问题并指导我。我非常需要这个。请问这个问题。 stackoverflow.com/questions/19706788/…。我想实现异步通信。请帮助并感谢您的时间。请。!!!
    • @Kumar 抱歉,您的问题我没有现成的答案。
    猜你喜欢
    • 1970-01-01
    • 2015-01-13
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多