お知らせまでに、JavaOne 2010でAdam Bien氏が提供したIronMan管理システムの例を複製しています。
IronManManagementSystem
http://kenai.com/projects/javaee-patterns/sources/hg/show/IronManManagementSystem?rev=134
Adam Bien - Sun Certified Architect and Trainer for Java Technology
http://adam-bien.com/
Adamはすばらしいプレゼンターであり、彼のプレゼンはチェックしておいて損はないでしょう。
Java EE 6では、EJBをWARに保持することができ、ejb-jarはオプション(!)です。JDeveloper、WebLogic Server 10.3.1で、Java EE 5を使うときは、EJBをWARファイルと分離する必要があります。Adamの例では、JAX-RSアノテーションをEJBに施していたので試してみましたが、Jerseyサーブレットが定義したパスを見つけることができず、結果としてManaged Beanに追加してEJBを注入しようとしました。
不幸にも、JAX-RS GETリクエストに関わるManaged BeanにEJBは注入されませんでした。JSFページを通じてManaged Beanにアクセスした場合にEJBを注入することができます。
Managed Beanのコードをこんな感じです。
EJBが注入されなかったので、上記の赤文字部分でNull Pointer Exceptionが発生しました。これはJava EE 5の制限なのか、それとも何か悪い設定やコーディングをしたのでしょうか(それとも両方?)…。@Path("ironmans") public class IronManBean { @EJB IronManServiceLocal ims; public String sayHello() { IronMan im = new IronMan(); ims.mergeIronMan(im); return ims.hiIronMan(); } @GET @Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML}) public List<IronMan> getIronMans() { return ims.getIronManFindAll(); // NPE happens here } }
UPDATE:
Adamの助言を受けて修正したところ、Managed BeanおよびRESTのユースケースで問題なく動作します。IronManServiceLocal を IronManService に変更し、以下のポストコンストラクトメソッドを追加しました。
「アノテーション付き EJB 3.0 クラスのプログラミング」が役に立ちました。@PostConstruct public void diWorkAround() { try { ims = (IronManService)InitialContext.doLookup("IronManService#com.ims.IronManService"); } catch (Exception e) { throw new RuntimeException("Unable to lookup IMS."+e); } }
Programming WebLogic Enterprise JavaBeans, Version 3.0
Programming the Annotated EJB 3.0 Class (英語)
http://download.oracle.com/docs/cd/E11035_01/wls100/ejb30/program.html
WebLogic エンタープライズ JavaBeans バージョン 3.0 プログラマーズ ガイド
アノテーション付き EJB 3.0 クラスのプログラミング (日本語)
http://otndnld.oracle.co.jp/document/products/wls/docs100/ejb30/program.html
原文はこちら。
http://blogs.oracle.com/wayneyoung/entry/using_jax-rs_with_jdeveloper_a
0 件のコメント:
コメントを投稿