java - 如何将 EJB 3.1 公开为 REST Web 服务?

标签 java web-services http ejb jax-rs

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

问题是无状态和单例 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 中缺少什么以便它可以用作 Web 服务资源,例如 GenericResource 类正在做的事情?

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

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

最佳答案

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

create a subclass of javax.ws.rs.core.Application, all Rest resources will be registered by this class automatically (Java EE 6)

create default Jersey REST servlet adaptor in web.xml.

我一直使用第二种选择,将其添加到您的 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 非常有用。你可以在任何你喜欢的地方注入(inject)它,你可以在你的 EntityManager 中注入(inject)它,你甚至可以在一些简单的情况下将它用作 DAO。

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

最后,您可以按照说明使用容器管理的事务 here .此外,来自this NetBeans tutorial :

In order to have you can see that the application will use the Java Transaction API (JTA) (transaction-type="JTA"). This specifies that the responsibility for managing the lifecycle of entities in the persistence context is assigned to the container.

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

关于java - 如何将 EJB 3.1 公开为 REST Web 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9883843/

相关文章:

java - Play 框架数据库搜索

java - CF8 SSL 连接到 Postgres 失败

c# - HttpListener 问题

file - 是否可以为 Zend 文件传输适配器设置名称、类型、大小?

java - 如何使用spring的MockMultipartHttpServletRequest?获取 "no multipart boundary was found"

java - 告诉 javac 忽略 System.out.println()

java - 在 Java 中使用 indexOf 查找字符串中的空格

c# - 如何在 Visual Studio 中为生产环境配置 Web 引用

C# WebService 客户端原始输入/输出

使用xml而不是jaxb注释的Java webservice工具?