[WLS, Java] Using JAX-RS with JDeveloper and Weblogic

最近JerseyとJAX- RSを触っているのですが、NetBeansとGlassFishの組み合わせだと簡単にJava EE 6を使えます。
お知らせまでに、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のコードをこんな感じです。
@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
    }
}
EJBが注入されなかったので、上記の赤文字部分でNull Pointer Exceptionが発生しました。これはJava EE 5の制限なのか、それとも何か悪い設定やコーディングをしたのでしょうか(それとも両方?)…。


UPDATE:
Adamの助言を受けて修正したところ、Managed BeanおよびRESTのユースケースで問題なく動作します。IronManServiceLocal を IronManService に変更し、以下のポストコンストラクトメソッドを追加しました。
@PostConstruct
  public void diWorkAround() {

    try {
      ims = (IronManService)InitialContext.doLookup("IronManService#com.ims.IronManService");
    } catch (Exception e) {
       throw new RuntimeException("Unable to lookup IMS."+e);
    }
  }
「アノテーション付き EJB 3.0 クラスのプログラミング」が役に立ちました。

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 件のコメント:

コメントを投稿