web-dev-qa-db-ja.com

EJB3.1をREST Webサービスとして公開する方法は?

Adam Bien's ブログの記事を読んでいるときに、EJB 3.1を使用すると、Java安らかな新機能を発見しました。

重要なのは、ステートレスBeanとシングルトン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 正常に動作します!

だから私の質問は:

  • genericResourceが実行しているクラスなどのWebサービスリソースとして機能できるように、EJBには何が欠けていますか?

  • 追加の構成が必要ですか?

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

10
sfrj

これによると Jersey RESTFul Webサービスに関するNetBeansチュートリアル 、あなたはするかどうかを決めることができます

javax.ws.rs.core.Applicationのサブクラスを作成すると、すべてのRestリソースがこのクラスによって自動的に登録されます(Java EE 6)

または

web.xmlにデフォルトのJersey RESTサーブレットアダプタを作成します。

私は常に2番目の選択肢を使用しました。これは、これを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は、warファイルにデプロイされているかどうかに関係なく、EJBコンテナーで実行されます。 Java EE 6チュートリアルの このセクション で説明されているように、JMS ConnectionFactoryをリソースとして注入できます。ConnectionFactoryの注入のおかげで、送信できます。 JMSメッセージ。JMSメッセージを非同期で受信する場合は、上記のチュートリアルの このセクション で説明されているようにメッセージ駆動型Beanを定義する必要があります。 MessageListenerインターフェースを実装するためのJerseyWebサービスですが、それも可能であるはずです(そうでない場合は、MDBをJerseyルートのステートレスBeanに注入できます)。

最後に、説明されているように、コンテナ管理のトランザクションを使用できます ここ 。さらに、 このNetBeansチュートリアル から:

アプリケーションがJava Transaction API(JTA)(transaction-type = "JTA")を使用することを確認するために、これは、エンティティのライフサイクルを管理する責任を指定します。永続コンテキストはコンテナに割り当てられます。

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