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

时间:2012-03-27 05:32:20

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

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

问题在于Stateless和Singleton bean可以作为root资源公开。但是怎么样? 我试着这样做:

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

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

}

当我拨打网址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!";
    }
}

此处,当我调用网址http://localhost:8080/HybridSample/resources/genericresource/samplemethod时效果正常!

所以我的问题是:

  • 我的EJB中缺少什么,所以它可以作为Web服务资源工作,例如GenericResource类正在做什么?

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

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

1 个答案:

答案 0 :(得分:11)

根据此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消息,则需要按照上述教程的this section中的说明定义消息驱动Bean。 我从未尝试扩展用于Jersey Web服务的相同EJB以实现MessageListener接口,但我认为这也应该是可行的(如果没有,您可以将MDB注入您的Jersey根无状态bean)。

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

  

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

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