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

#始めに
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&lt;T&gt;のサブクラスのインスタンスを渡す必要がある
- TypeReference&lt;T&gt;のＴにはList&lt;List含まれるクラス名&gt;を指定する
- writerWithTypeの戻り値からwriteValueAsStringを呼び出し、引数にJSONに変換したいListを指定する

今回の例ではDBから取得した値はList<Area>で返ってくるため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("ＨＴＴＰサーバーが開始されました");
    }
}
```

# 実行結果
下の画像のようにブラウザからURLを入れると、JSON形式でレスポンスが返ってくることが分かる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136860/1c0f0c4c-fd60-3f17-fcc0-8b079e7a89e8.png)