メモ的な何か

技術的な私のメモになる予定です。

自作アプリ「BookSelf」のWebAPI部分の解説

前々述した自作アプリのWebAPI部分の解説になります。

JAX-RSを使用しJSONのサービスを作成しています。
内部ではJPAを使用してDBの読書きも行っております。
記述を減らしてWebサービスを記載できそうなのとわりと新しい技術かなと思ったからです。(仕事ではレガシーシステム担当だから新しく感じるのかも)

今回は記録のため、環境準備の手順とポイントを記載します。

環境準備

まずはEclipseを使っての準備手順を記載していきます。
Jerseyを使ってJAX-RSを使用します。
新規Mavenプロジェクト⇒ワークスペースはお任せ(デフォルトでOK)⇒groupId=org.glassfish.jersey.archetypes、ArtifactId=jersey-quickstart-webappを探して選択
⇒GroupId, ArtifactId, Version, Packageを任意で設定(ArtifactId=がプロジェクト名となります)
これでJAX-RSで動くサンプルが作成されます。
※参考
EclipseでJersey(JAX-RS)を始める - Qiita

JSONを使用するために

JSONとクラスをマッピングして扱えるようにします。
@Consumes("application/json")@Produces("application/json")だけでも大丈夫そうな記載がされているサイトもあったがこれがないと私の環境ではダメでした。
pom.xmlに以下を追加

<dependency>
	<groupId>org.glassfish.jersey.media</groupId>
	<artifactId>jersey-media-moxy</artifactId>
	<version>2.26-b09</version>
</dependency>

JSONのレスポンスを実装するクラス

@Path("myresource")
public class MyResource {
    @POST
    @Path("アクセスするパス")
    @Consumes("application/json")
    @Produces("application/json")
    public JSONで返すクラス function(JSONからクラスに変化されたクラス) {
    }
}

※参考
JAX-RSとかの話 — 裏紙
Jersey 2.x系でのJSONサービスに関して - クロノスの技術系ブログ
Jerseyの設定1(web.xmlとかApplicationクラスとか) - edgegram

JPAでDBへアクセス

DBにはMySQLJPAにはEclipseLinkを使用しました。
pom.xmlに以下を追加

<dependency>
	<groupId>org.eclipse.persistence</groupId>
	<artifactId>eclipselink</artifactId>
	<version>2.5.2</version>
</dependency>
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.31</version>
</dependency>

src/main/resources/META-INF/にpersistence.xmlを作成します。
url、user、passwordは任意の値を

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="test" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://0.0.0.0/test"/>
      <property name="javax.persistence.jdbc.user" value="test"/>
      <property name="javax.persistence.jdbc.password" value="pass"/>
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
    </properties>
  </persistence-unit>
</persistence>

JPAの使い方例(JPQLを使用)

EntityManagerFactory fac = Persistence
			.createEntityManagerFactory("test");// DB test
EntityManager em = fac.createEntityManager();

List<BookStorage> bookStorageList = em
	.createQuery("SELECT c FROM BookStorage c WHERE c.id = :id", BookStorage.class).setParameter("id", bookInfo.getId())
	.getResultList();

※参考
JAX-RS(Jersey)とJPAで簡単なサンプル - Qiita
JavaEE使い方メモ(JPA その3 - JPQL) - Qiita

CORS対応

私の実施している環境だとAngularとのクロスドメインでのアクセス許可を実施しないと通信ができなかったためフィルター機能で対応しています。

@Provider
public class AddHeaderCRFilter implements ContainerResponseFilter {

	@Override
	public void filter(ContainerRequestContext arg0,
			ContainerResponseContext arg1) throws IOException {

		arg1.getHeaders().add("Access-Control-Allow-Origin", "*");
		arg1.getHeaders().add("Access-Control-Allow-Headers",
				"origin, content-type, accept, authorization");
		arg1.getHeaders().add("Access-Control-Allow-Credentials", "true");
		arg1.getHeaders().add("Access-Control-Allow-Methods",
				"GET, POST, PUT, DELETE, OPTIONS, HEAD");
	}
}

※参考
JAX-RS2.0でRESTサービスを作る際にヘッダーを指定する - 自分の仕事を憎むには人生は余りにも短い


今回作ったサービスは以下に上げてます。
Tomcat 8でのみ動作確認済みです。
wildflyではeclipseLink関係でうまくうごかなかったです。
github.com

またサービスを動かすためにはDBにテーブルが必要です。
以下のSQLでテーブルを作成できます。

CREATE TABLE BOOKSTORAGE (ID VARCHAR(255) NOT NULL PRIMARY KEY, ISBN VARCHAR(255), TITLE VARCHAR(255), AUTHOR VARCHAR(255));


今回でBookSelfの記事は終了です。
今後改修等あれば記事の作成をしていこうかなと思ってます。(実用的にするにはまずGoogleBookAPIをやめるのが最初かな)