Jersey Grizzly で始める JAX-RS 入門 〜STEP3〜

前回作成したサンプルに続けてJAX-RS を使った CRUD アプリケーションを作成していきます。

blog1.mammb.com


EBean の導入

永続化を行うため、何でもよいですが今回は導入が簡単な EBean を使います。

build.gradle に以下の依存を追加します。

dependencies {

    // ・・・

    // H2
    compile 'com.h2database:h2:1.4.191'

    // EBean
    compile 'org.avaje.ebeanorm:avaje-ebeanorm:7.1.1'
    compile 'org.avaje:avaje-agentloader:2.1.2'
    compile 'org.avaje.ebeanorm:avaje-ebeanorm-agent:4.9.1'

    // ・・・
}

前回作成したモデルを Entity として扱うために AgentLoader も合わせて入れます。

データベースは H2 を使います。

EBean 設定と起動

最初に EBean の設定ファイル ebean.properties を resources 配下に作成します。

# generate DDL files
ebean.ddl.generate=true

# run ddl drops and recreates tables
ebean.ddl.run=true

ebean.uuidStoreAsBinary=true
ebean.databaseSequenceBatchSize=1

ebean.debug.sql=true
ebean.debug.lazyload=false

datasource.default=h2

datasource.h2.username=sa
datasource.h2.password=
datasource.h2.databaseUrl=jdbc:h2:mem:tests
datasource.h2.databaseDriver=org.h2.Driver

モデルから DDL を自動生成する指定と、H2 用の接続設定を定義しています。

続いて EBean の起動処理を main 内に追加しましょう。

public class Main {

    public static void main(String[] args) throws IOException {

        setupEbean();
        final HttpServer server = ・・・
    }
        
    private static EbeanServer setupEbean() {

        boolean success = AgentLoader.loadAgentFromClasspath(
                "avaje-ebeanorm-agent", "debug=1;packages=example.domain.model.**");

        if (!success) log.error("ebeanorm agent not found - not dynamically loaded");

        return Ebean.getServer("h2");

    }

setupEbean() メソッドを追加して main から呼ぶようにします。

Agent を仕込み example.domain.model パッケージ配下を Entity として扱えるように指定しています。

Entity の作成

EBean は JPAの機能サポートがあるので、Customer を @Entity でエンティティ指定します。

@Id でID指定、Address は @Embedded 指定しておきましょう。

package example.domain.model;

import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.Serializable;

@Entity
@XmlRootElement
public class Customer implements Serializable {

    @Id
    private Long id;
    private String firstName;
    private String lastName;
    @Embedded
    private Address address;

    Customer() { }

Address 側には @Embeddable を指定します。

import javax.persistence.Embeddable;
import java.io.Serializable;

@Embeddable
public class Address implements Serializable {
    // ・・・
}

これで Customer テーブルに Address の属性が埋め込まれた形で管理されるようになります。

CustomerResource

前回作成した CustomerResource を以下のように変更します。

@Path("customers")
public class CustomerResource {

    @GET
    @Path("{id}")
    @Produces({MediaType.APPLICATION_JSON})
    public Customer get(@PathParam("id") Long id) {
        return Ebean.find(Customer.class, id);
    }
    
    @POST
    @Consumes({MediaType.APPLICATION_JSON})
    public Response createCustomer(Customer customer) {
        Ebean.save(customer);
        return Response.created(
                URI.create("/customers/" + customer.getId())).build();
    }

}

@POST で HTTP POST に応答し、@Consumes({MediaType.APPLICATION_JSON}) でコンテントタイプとして Json を受け入れる指定をしています。

リソースへのアクセス

ではアプリケーションを起動してみましょう。

$ ./gradlew run

curl で POST リクエストを発行します。

$ curl 'http://localhost:8090/customers' -X POST -H 'Content-Type: application/json' -d '{"firstName":"Michael","lastName":" Stipe","address":{"street":"1016","city":"Hollywood","state":"CA","zip":"90038","country":"US"}}'

続けて GET で登録した Customer を取得してみます。

$ curl 'http://localhost:8090/customers/1'
{"id":1,"firstName":"Michael","lastName":" Stipe","address":{"street":"1016","city":"Hollywood","state":"CA","zip":"90038","country":"US"}}

POSTで登録した内容が取得できていますね。

ここまでのソースはGithubを参照してください。

blog1.mammb.com