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サービスとして使用する場合の制限は何ですか?
これによると 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">