在阅读 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/