LoginSignup
2
2

More than 5 years have passed since last update.

SImpleなJAX-RSアプリについて

Last updated at Posted at 2018-04-22

始めに

simpleなJAX-RSアプリケーションについて書いてみます
実装するアプリはDBから値を取得して、json形式でブラウザに返すものです
アプリケーションサーバとか用意するのが面倒くさいので、HTTPサーバはJDK付属のHTTPサーバを使っています

前提

  • JAX-RSに関連するjarがすべてクラスパスに通っていること
  • OpenJPAに関するjarがすべてクラスパスに通っていること
  • jacksonに関するjarがすべてクラスパスに通っていること
  • jerseyのHTTPサーバに関するjarがすべてクラスパスに通っていること

アプリ作成の手順

  1. Open-JPAのモジュールを作成する
  2. JAX-RSモジュールを作成する
  3. HTTPサーバのモジュールを作成する
  4. 実行結果

1. Open-JPAのモジュールを作成する

まずは、教科書通り、OpenJPAのエンティティクラスを記述する

Area.java
package entiry;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQuery;

@Entity
@NamedQuery(
        name="namedQuerrySample",
        query="SELECT i FROM Area i where i.areaCode =:code"
    )   

public class Area {
    /**エリアコード */
    @Id
    @Column(name="area_code",length=4)
    private String areaCode;
    /**エリア名 */
    @Column(name="area_name")
    private String areaName;
    /**管理担当者 */
    @Column(name="kanri_Tantou",length=4)
    private String kanriTantou;

    public String getAreaCode() {
        return areaCode;
    }
    public void setAreaCode(String areaCode) {
        this.areaCode = areaCode;
    }
    public String getAreaName() {
        return areaName;
    }
    public void setAreaName(String areaName) {
        this.areaName = areaName;
    }
    public String getKanriTantou() {
        return kanriTantou;
    }
    public void setKanriTantou(String kanriTantou) {
        this.kanriTantou = kanriTantou;
    }
}

次に、DBから値を取り出すロジックスラスを作成する

MyLogic.java
package logic.dbh29;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import entiry.Area;
public class MyLogic {
    public List<Area> doAreaSelect(){
        EntityManagerFactory factory = 
            Persistence.createEntityManagerFactory("myUnitInPersistenceXML");
        EntityManager em = factory.createEntityManager();
        return em.createNamedQuery("namedQuerrySample", Area.class)
        .setParameter("code", "1111")
        .getResultList();
    }
}

2.JAX-RSモジュールを作成する

JAX-RSモジュールからDBにアクセスするモジュールを呼び出し、JSON形式でレスポンスを返すクラスを作成する。
なお、DBから取得した値はListで返ってくるため、JSON形式に変換する際はひと工夫必要になる
具体的には

  • JSONに変換するオブジェクトの型を指定するため、writerWithTypeを使う
  • writerWithTypeの引数にはTypeReference<T>のサブクラスのインスタンスを渡す必要がある
  • TypeReference<T>のTにはList<List含まれるクラス名>を指定する
  • writerWithTypeの戻り値からwriteValueAsStringを呼び出し、引数にJSONに変換したいListを指定する

今回の例ではDBから取得した値はListで返ってくるためwriterWithTypeの引数には
new TypeReference<List<Area>>() {}
を指定してあげればよい

SampleRooter.java
package rooter;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import entiry.Area;
import logic.dbh29.MyLogic;

@Path("sample")
public class SampleRooter extends BaseRooter {
    @Path("Area")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public String doLogic (
        @QueryParam("x") String ax, 
        @QueryParam("y") String ay          
    )throws Exception{
        return new ObjectMapper()
        .writerWithType(new TypeReference<List<Area>>() {})
        .writeValueAsString(new MyLogic().doAreaSelect());
    }
}

3.HTTPサーバのモジュールを作成する

2.で作成したJAX-RSモジュールをResourceConfig指定して、mainクラスからHTTPサーバーを実行するだけです

URLExe.java
package main;

import java.net.URI;

import rooter.SampleRooter;

import org.glassfish.jersey.jdkhttp.JdkHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;
import com.sun.net.httpserver.HttpServer;
public class URLExe {

    public static void main(String[] args) {
        URI uri = URI.create("http://localhost:8081/");

        ResourceConfig rc = new ResourceConfig();
        rc.register(SampleRooter.class);

        HttpServer httpServer = JdkHttpServerFactory.createHttpServer(uri, rc);
        Runtime.getRuntime().addShutdownHook(new Thread(() -> httpServer.stop(0)));

        System.out.println("HTTPサーバーが開始されました");
    }
}

実行結果

下の画像のようにブラウザからURLを入れると、JSON形式でレスポンスが返ってくることが分かる
image.png

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2