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

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

问题是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!!!"; } } 

当我调用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服务有什么限制?

根据有关Jersey RESTFul Web服务的NetBeans教程 ,您可以决定是否

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

要么

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

我一直使用第二种选择,包括将其添加到您的web.xml

  ServletAdaptor com.sun.jersey.spi.container.servlet.ServletContainer 1   ServletAdaptor /resources/*  

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

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

最后,您可以使用此处说明的Container-Managed事务。 此外,从此NetBeans教程 :

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