ひこぽんのーと

覚書と雑記です。

JavaEE 7をやってみよう。 JPA その8

その7のつづき。

今度はEJBを呼び出す処理を実装する。
Webアプリ側なので画面とか必要なのだが、
まずは、ちゃんとDB参照できるか手軽に確認するために、
RESTのWebAPIとして機能を作ってみる。

作るクラスは2つ。
RestApplicationクラスとEJBを呼び出すResourceクラスの2つ。
では、ソース。

  • RESTアプリケーションクラス
package app;


import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/rest")
public class RestApplication extends Application {

}
  • Warshipリソースクラス
package app.res;

import java.util.List;

import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

import model.Warship;

import org.jboss.resteasy.annotations.providers.jaxb.Formatted;

import ejbModule.WarshipServiceLocal;

@RequestScoped
@Path("/warship")
public class WarshipResource {
    @EJB
    private WarshipServiceLocal ejb;
    
    @Path("/test")
    @GET
    @Produces("text/plain")
    public String getTest() {
        return "ALive!";
    }
    
    @Path("/all")
    @POST
    @Produces({"application/json;charset=UTF-8"})
    @Consumes({"application/json;charset=UTF-8"})
    @Formatted
    public List<Warship> getAll() {
        List<Warship> allList = ejb.getAllList();
        return allList;
    }
}

RESTアプリケーションのアノテーションなんかについては、以前のRESTの項を見てもらうとして*1
ここではWebアプリケーション→EJBの呼び出しについて補足する。
といっても前回作ったEJBメソッドを呼んでいるだけ。
メンバにEJBのローカルインターフェイスを定義して、目的の箇所で使用するだけOKなので簡単。
ここではgetAllメソッド内で、EJBからDB呼び出しを行っている。
また、EJBのローカルインターフェイスに@EJBアノテーションを付けておけば、
インスタンスは自動的にインジェクションされる。

といったところで、ようやっと、
Webプロジェクト → EJBJPA → DBの流れができたので、
動作確認をやってみよう!

デプロイ前に、Wildflyの状態を確認。
DBサーバが起動した状態でWildflyを起動して、
JDBCドライバがデプロイされているかを確認する。
手順についてはJDBCドライバをデプロイした回を参照のこと。

問題がなければ、Eclipseのサーバーのタブから、Wildflyを選択し、
コンテキストメニューから「追加および除去」を選ぶ。
ダイアログから今回作成したEnterprizeアプリケーションプロジェクトを追加して、完了を押す。
しばらく待つと、デプロイが始まってWildflyに配備される。
f:id:nagamitsu1976:20151008152254p:plain

デプロイ後、ブラウザからテストメソッドを叩いて正しくデプロイで着ているか確認してみる。
URLはhttp://localhost:8080/(Webプロジェクト名)/rest/warship/test
問題なければ、"ALive!"と文字列が表示できる。
f:id:nagamitsu1976:20151008153047p:plain

リソースクラスの配備にも問題が無いのがわかったところで、
JMeterから全件参照のメソッドを叩いてみる。
URLはhttp://localhost:8080/(Webプロジェクト名)/rest/warship/all
ちなみにWarshipResource.getAll()メソッドをPOSTで作ったので、
ブラウザからURLを直接叩いても値は取得できない。

あらかじめデータをDBに登録しておくと、こんな感じで抽出できる。
f:id:nagamitsu1976:20151008161038p:plain
f:id:nagamitsu1976:20151008161047p:plain

なんとかDB参照までこぎつけることが出来た。
あとは、追加、削除あたりをやってみないことには、
JPAの概要は得られないか。

といったところで、次回へ続く。