2012-03-27 12 views
8

Adam Bien'sブログで記事を読んでいるときにEJB 3.1を使用しているときに、Javaの新しい機能がわかりました。EJB 3.1をREST Webサービスとして公開するにはどうすればよいですか?

ステートレスとシングルトンの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リソースを作成しました。

ここで私はURL http://localhost:8080/HybridSample/resources/genericresource/samplemethodを呼び出すと問題なく動作します。

だから私の質問は以下のとおりです。

  • それは、このようなGenericResourceがやっているクラスなどのWebサービス・リソースとして働くことができるように、私のEJBに欠けているもの?

  • 追加の設定が必要ですか?

  • EJBをWebサービスとして使用する場合の制限は何ですか?

答えて

11

このNetBeans tutorial about Jersey RESTFul web servicesによると、あなたは

がjavax.ws.rs.core.Applicationのサブクラスを作成するかどうかを決定することができ、すべてのRESTリソース は、自動的にこのクラス(Javaのことで登録されますEE 6)

または

デフォルトJERSを作成ey RESTサーブレット・アダプタをweb.xmlに追加します。

私はいつもあなたのweb.xmlにこれを追加することで構成されて2番目の選択肢、使用している:EJBは、私の経験に、非常に有用であるとして

<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サービスを公開します。好きな場所に挿入することもできますし、EntityManagerに注入することもできますし、単純な状況でDAOとして使用することもできます。

機能と制限についてのご質問/ご意見について:エンタープライズBeanは、WARファイルにデプロイされているかどうかに関係なく、EJBコンテナ内で実行されます。 Java EE 6チュートリアルのthis sectionで説明されているように、JMS ConnectionFactoryをリソースとして注入できます。 ConnectionFactoryの注入により、JMSメッセージを送信できます。非同期にJMSメッセージを受信する場合は、前述のチュートリアルのthis sectionで説明されているように、メッセージ駆動型Beanを定義する必要があります。 MessageListenerインターフェースを実装するためにJersey Webサービスに使用されているのと同じEJBを拡張しようとは決してしませんでしたが、そうすることも可能であるはずです(もしそうでなければ、JerseyルートステートレスBeanにMDBを注入できます) 。

最後に、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'を使い、ウィザードの後に​​ステートレスBeanとしてWebサービスを作成するというオプションをチェックします。挿入されたEJBは.warファイルに追加され、今はうまく動作します。私の例はうまくいきますが、シーンの背景に何が起こっているのかを知ることにも興味があります。どのファイルがNet Beansによって編集されていますか?また、この豆の限界は何ですか? これは本当にクールな機能だと思います。 – sfrj

+0

NetBeansは何も追加していません。唯一必要なことは、Statelessクラス(例ではRESTEJBSample)とweb.xmlのサーブレットアダプタを作成することです。サーブレットは背後にあるすべての魔法を実行しています。限界については、少し質問を明確にしようとするべきだと思います。 – perissf

+0

私が言いたいのは、私が意味する限界です。このBeanは、EJBモジュールにデプロイされたときと同じように動作しますか?つまり、何らかの手動トランザクション管理が必要なのでしょうか?JMSと対話できますか...今はEJBコンテナにはなく、.warファイルに入っています。 – sfrj

関連する問題