2012-03-27 65 views
8

當我在閱讀Adam Bien's博客文章的同時使用EJB 3.1時,發現了java restful中的新特性。如何將EJB 3.1公開爲REST Web服務?

事情是無狀態和Singleton 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錯誤。

的這家Appart和公正,以確保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服務時有什麼限制?

回答

11

根據這一NetBeans tutorial about Jersey RESTFul web services,你可以決定是否

創建javax.ws.rs.core.Application的子類,所有的REST資源 將此類自動(Java的註冊EE 6)

創建默認JERS在web.xml中添加一個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。

關於有關功能和限制您的問題/評論:在EJB容器中運行企業Bean,無論它們被部署在一個WAR文件或沒有。如Java EE 6教程的this section中所述,您可以將JMS ConnectionFactory作爲資源注入其中。感謝ConnectionFactory的注入,您可以發送JMS消息。如果您想異步接收JMS消息,則需要按照上述教程的this section中的說明定義消息驅動Bean。 我從來沒有嘗試過爲了實現MessageListener接口而擴展用於Jersey Web服務的相同EJB,但我認爲這也應該是可能的(如果不是這樣,您可以將一個MDB注入到Jersey根無狀態bean中) 。

最後,您可以使用容器管理的交易,如解釋here所述。此外,從this NetBeans tutorial

爲了讓你可以看到應用程序將使用Java 事務API(JTA)(交易型= 「JTA」)。這指定 負責管理 持久性上下文中實體的生命週期的責任分配給容器。

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

好,我不知道第一個:)的web.xml文件選項也是我favoutity,目前我的web.xml lookl這樣了。 另外我使用了Netbeans IDE'New-> Webservice',並且按照嚮導我選中了一個選項,表示將Web服務創建爲無狀態bean。該插入將EJB添加到.war文件中,現在它工作正常。我的例子現在工作正常,但我也有興趣知道幕後發生了什麼?,哪些文件正在被Net Beans編輯?還有這個bean的侷限性是什麼? 是的,我認爲這是一個非常酷的功能。 – sfrj 2012-03-27 06:55:23

+0

NetBeans不添加任何內容:唯一需要做的事情是創建Stateless類(在您的示例中爲RESTEJBSample)和web.xml中的servlet適配器。這個servlet正在幕後做所有的魔術。關於侷限性,我認爲你應該試着澄清一下你的問題。 – perissf 2012-03-27 09:43:11

+0

當我提到限制我的意思。這些bean能夠像在EJB模塊中部署時一樣行事嗎?我的意思是,是否需要某種手動事務管理?它們可以與JMS交互嗎?...現在它們不在EJB容器中,它們位於.war文件中。 – sfrj 2012-03-28 11:02:55