Hatena::ブログ(Diary)

MoonMt.Lab IT開発技術 調査報告書 RSSフィード

2015年03月21日

REST風サービスをJavaEEで構築する方法08(Logic層編)

今回はLogic層の実装方法を紹介する。

前回までサーバ側の処理はApi層のクラスある「SampleApi」に記述してきた。
しかし、Api層はRESTクライアントからの処理要求を受け付ける役割を行うクラスであり、詳細な処理を記述するべきではない。
詳細な処理はLogic層に記述することになる。

<前提条件>
下記の記事を読了していること。
REST風サービスをJavaEEで構築する方法01(導入編)
REST風サービスをJavaEEで構築する方法02(雛形プロジェクト編)
REST風サービスをJavaEEで構築する方法03(RESTクライアント編)
REST風サービスをJavaEEで構築する方法04(各メソッド編)
REST風サービスをJavaEEで構築する方法05(パラメータの受け取り編)
REST風サービスをJavaEEで構築する方法06(JSON返却編1)
REST風サービスをJavaEEで構築する方法07(JSON返却編2)

<全体像から見た位置づけ>
Logic層の実装を行う。また、Api層にLogic層の処理を呼び出す追加編集を行う。
f:id:MoonMtLab:20150320231338p:image:w640

<手順概要>
1.Logic層のクラスを作成する
2.Logic層のクラスを編集する
3.Api層からLogic層のメソッドを呼び出す

<手順詳細>
1.Logic層のクラスを作成する
プロジェクトツリー上の「ソース・パッケージ」を右クリックし、[新規]>[Javaクラス]を選択する。
f:id:MoonMtLab:20150320231339p:image

表示されたダイアログのクラス名に「SampleLogic」(※)・パッケージ名に「lab.moonmt.SampleRest.logic」(※)を設定し、【終了(F)】ボタンを押下する。
(※)任意の名前をつけることができる。
f:id:MoonMtLab:20150320231340p:image:w640

クラスが作成されたことを確認する。
f:id:MoonMtLab:20150320231341p:image

2.Logic層のクラスを編集する
Logic層はEJB(Enterprise JavaBean)として実装する事になる。
EJBのセッションビーンには、「ステートレス」「ステートフル」「シングルトン」の3種類が存在し、どの種類を実装しているかをクラス名の上部に、アノテーションとして指定する必要がある。

種類アノテーション説明
ステートレス@Stateless内部の変数は毎回初期化される。1回の呼び出しで完結する処理に使用する。
ステートフル@Stateful内部の変数は保持される。複数回の呼び出しで継続的な処理を行う時に使用する。
シングルトン@Singleton1つのアプリケーションでオブジェクトを1つしか存在させたく無い時に使用する。


手順1で作成したクラスを編集し、引数として受け取った文字列に、固定文字列を付加して返却する処理を実装する。

package lab.moonmt.SampleRest.logic;

import javax.ejb.Stateless;

@Stateless                  //...(1)
public class SampleLogic {
    
    public String sampleMethod(String name){
        
        return name + "_add_string";
    }
}


ソースコード解説

番号説明
(1)ステートレスなEJBであることを、「@Stateless」アノテーションで指定している。


3.Api層からLogic層のメソッドを呼び出す
REST風サービスをJavaEEで構築する方法07(JSON返却編2)で編集した「SampleApi」クラスを追加編集する。

package lab.moonmt.SampleRest.api;

import javax.ejb.EJB;
import javax.ws.rs.DELETE;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;
import lab.moonmt.SampleRest.dto.SampleDto;
import lab.moonmt.SampleRest.logic.SampleLogic;
import net.arnx.jsonic.JSON;

@Path("sampleApi")
public class SampleApi {
    
    @EJB
    private SampleLogic sampleLogic;                     //...(1)
    
    @GET              
    @Path("getSample")
    public String getSampleMethod(
            @QueryParam("id")   String id,
            @QueryParam("name") String name
    ){
        
        System.out.println("id:" + id + ",  name:" + name);
        
        SampleDto dto = new SampleDto();
        dto.status = "success";
        dto.id     = id;
        dto.name   = sampleLogic.sampleMethod(name);    //...(2)
                        
        return JSON.encode(dto);
    }
    
    @POST
    @Path("postSample")
    public String postSampleMethod(
            @FormParam("id")   String id,
            @FormParam("name") String name
    ){
        
        System.out.println("id:" + id + ",  name:" + name);
        
        SampleDto dto = new SampleDto();
        dto.status = "success";
        dto.id     = id;
        dto.name   = sampleLogic.sampleMethod(name);    //...(2)
                        
        return JSON.encode(dto);
    } 
    
    @PUT
    @Path("putSample")
    public String putSampleMethod(
            @FormParam("id")   String id,
            @FormParam("name") String name
    ){
        
        System.out.println("id:" + id + ",  name:" + name);
                        
        SampleDto dto = new SampleDto();
        dto.status = "success";
        dto.id     = id;
        dto.name   = sampleLogic.sampleMethod(name);    //...(2)
                        
        return JSON.encode(dto);
    }
    
    @DELETE
    @Path("deleteSample/{id}")
    public String deleteSampleMethod(
            @PathParam("id")   String id
    ){
        
        System.out.println("id:" + id);
                        
        SampleDto dto = new SampleDto();
        dto.status = "success";
        dto.id     = id;
                        
        return JSON.encode(dto);
    }
}


ソースコード解説

番号説明
(1)ロジック層のクラスを「@EJB」を付与して宣言しておくと、フレームワークインスタンスをインジェクションしてくれる。(newする必要がなくなる)
(2)(1)で宣言した変数を使用して、ロジック層クラスのメソッドを呼び出している。


<動作確認>
プロジェクトを実行し、ブラウザに表示されたボタンを押下すると、ロジック層クラスのメソッドで固定文字列が付加されたJSON形式のデータがダイアログに表示されることを確認する。

Enjoy Programing!!


<関連記事>
REST風サービスをJavaEEで構築する方法01(導入編)
REST風サービスをJavaEEで構築する方法02(雛形プロジェクト編)
REST風サービスをJavaEEで構築する方法03(RESTクライアント編)
REST風サービスをJavaEEで構築する方法04(各メソッド編)
REST風サービスをJavaEEで構築する方法05(パラメータの受け取り編)
REST風サービスをJavaEEで構築する方法06(JSON返却編1)
REST風サービスをJavaEEで構築する方法07(JSON返却編2)
・REST風サービスをJavaEEで構築する方法08(Logic層編)[本記事]
REST風サービスをJavaEEで構築する方法09(DB接続設定編)
REST風サービスをJavaEEで構築する方法10(DAO層編1)
REST風サービスをJavaEEで構築する方法11(DAO層編2)
REST風サービスをJavaEEで構築する方法12(DAO層編3)
REST風サービスをJavaEEで構築する方法13(SQLログ編)


<お勧め書籍>
わかりやすいJavaEEウェブシステム入門
JavaEEに関して基本的なことが分かり易く記述されている。
JavaEEに関する最初の1冊としてお勧めである。
Beginning Java EE 6 GlassFish 3で始めるエンタープライズJava
「金魚本」の愛称を持つJavaEEの教科書的な書籍である。
JavaEEを腰を据えて学びたい人にお勧めする1冊!!

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

リンク元
Connection: close