前回作成したサンプルに続けてJAX-RS を使った CRUD アプリケーションを作成していきます。
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を参照してください。