REST APIで受け取ったJSONを変換して、データ格納用クラスに入れようという試みです。
調べてみたところ、Jacksonを使うといい感じにできそうです(他にいい方法もあるかも)
使うもの
- Jersey : REST APIを作るやつ
- Tomcat : Web Serviceを動かすやつ
- Jackson : JSONデータを変換するやつ
- Eclipse : 統合開発環境
ステップ1:Jerseyのプロジェクトをmavenで生成
今回はJerseyのVer 2.34を使います。プロジェクトを作ります。
もうあるよって方は読み飛ばしてください。
Jersey 2.34 User Guideの1.4. Creating a JavaEE Web Applicationからプロジェクト作成コマンドをコピペして、ターミナルにて実行します。
mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-webapp \
-DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false \
-DgroupId=com.example -DartifactId=simple-service-webapp -Dpackage=com.example \
-DarchetypeVersion=2.34
-DgrupId、-DartifactId、-Dpackageは必要に応じて変更しましょう。私はそのままで行きます。
私はEclipseで開発しているので、Eclipseで開きます。
File > Import… > General > Projects from Folder or Archiveから、プロジェクトのDirectoryを選択してFinishをクリックすると、プロジェクトをインポートできます。
フォルダの中身はこんな感じです。
simple-service-webapp
├── pom.xml
├── src
└── main
├── java
│ └── com
│ └── example
│ └── MyResource.java
├── resources
└── webapp
├── WEB-INF
│ └── web.xml
└── index.jsp
ステップ2: JerseyでJacksonを使えるようにする
Jacksonを使うための準備をします。やり方は、Jersey 2.34 User Guideの9.1.4. Jackson (1.x and 2.x)に書いてあるので参考にしてください。
まず、pom.xmlに必要なライブラリを追加します。<dependencies>の中に次を追加しましょう。
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
</dependency>
これを追加するだけでOKっぽいです
User Guideには、JacksonをJSON (JAXB/POJO) providerに使うならJacksonFeatureとObjectMapperのContextResolver<T>の登録がいるって書いてます。
In order to use Jackson as your JSON (JAXB/POJO) provider you need to register JacksonFeature (Jackson1Feature) and a
ContextResolver<T>
forObjectMapper
, if needed, in your Configurable (client/server).
とりあえず、なくても動くのでOK!(実はよくわかっていない)
ステップ3: データ格納用クラスを作成
JSONのデータを変換して格納するクラスを作ります。
package com.example;
import com.fasterxml.jackson.annotation.JsonProperty;
public class Data {
@JsonProperty
private int id;
@JsonProperty
private String name;
public int getId() {
return id;
}
public String getName() {
return name;
}
}
JSONのキーとなる変数には@JsonPropertyのアノテーションをつけます。
アノテーションをつけた変数名とJSONのキーを照らし合わせて値を取得します。
@JsonProperty(“id”)みたいにしたら、キーの名称も指定できます。
ステップ4: JSONを受け取るPOST APIを作成する
デフォルトで作成されるMyResource.javaにPOSTのAPIを追加します。
こんな感じ↓
@POST
@Path("/json")
@Consumes(MediaType.APPLICATION_JSON)
public String post(Data data) {
return "id = " + data.getId() + ", name = " + data.getName();
}
@Consumesで受け取るデータの種類を指定しています。今回はapplication/jsonですね。
Dataクラスの変数にJSONで指定した値が格納され、雑にidとnameの文字列を返します。
ステップ5: プロジェクトを起動して、POST APIにJSONを渡す
Tomcatにアプリをデプロイして、APIを実行します。
私はPostmanでチェックすることが多いのですが(それしか使ったことない)、ここではcurlの例を紹介します。
curl --location --request POST 'http://localhost:8080/simple-service-webapp/webapi/myresource/json' \
--header 'Content-Type: application/json' \
--data-raw '{
"id": 1,
"name": "tanaka"
}'
これをターミナルで実行して、こんな感じの文字列が表示されれば成功です。
id = 1, name = tanaka
まとめると簡単にできるじゃんって思う
以上、REST APIで受け取ったJSONを変換して、データ格納用クラスに入れる方法でした。
調べているうちは難しいって思うのですが、
まとめてしまうと簡単に見えますね。
コメント