スマートデバイスアプリ開発のあれやこれや

Spring Bootで作る簡単WebAPI

サーバ通信を行うスマホアプリを開発する際にデータをやり取りするWebアプリ
(※httpでリクエストするとJSONで結果を返す類のWebAPI)が必要だったので
何とか簡単に作れないかと模索ところ、Spring Bootがなかなか便利だった。


最大の便利ポイントはAPサーバ(Tomcat)を組み込んだ.jarファイルが作れるところ。
関係者に展開するときに”.jarファイルをjava -jarで実行すりゃいいよ!”で済むのが良い。
(関係者の環境で”動かない!”とか言われて揉めるのを避ける効果がある!)


手順をさらっとまとめてみます。
ちなみに検証環境は以下の通り。

1. Mavenプロジェクトを作る

Eclipseのプロジェクト作成ウィザードからMavenプロジェクトを選択する。
最近、Mavenを使い始めた初心者だけど、ライブラリ同士のバージョン関係をいっさい
考えなくても必要なライブラリ一式がゴッソリ入手出来る点が素晴らしいです。
(ただ、相手側もMaven知ってる前提じゃないとソース展開が面倒)

ちなみにMavenプロジェクトのarchetypeは指定なしで良いです。
「Create a Simple Project」をしれっと選択して次に進む。
artifacatIdやgroupId、バージョンは任意の設定でOK。

2. pom.xmlファイルを編集する

必要なライブラリの依存関係を定義するpom.xmlファイルを編集する。

  <parent>
  	<groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.0.2.RELEASE</version>
  </parent>

まず、parent要素に上の内容を追記。
Spring Bootを使う上での必要ライブラリ諸々が定義された
親のpom.xmlファイルを入手しますよ......という意味だと思う。
後述のdependencyも親のpom.xmlの利用が前提になっている。

  <dependencies>
  	<dependency>
  		<groupId>org.springframework.boot</groupId>
  		<artifactId>spring-boot-starter-web</artifactId>
  	</dependency>
  </dependencies>

続いて本命のSpring Boot本体を取得する依存性設定を追加する。

この状態で保存して、プロジェクト右クリック Maven --> Update Projectを実行。
これでインターネットから必要なライブラリがローカルにダウンロードされる。
Maven Dependencies」にjarファイルが入ってれば成功。

3. Controllerクラスを作る

クライアントからのリクエストを受け付けるControllerクラスを作る。

@Controller
@EnableAutoConfiguration
public class SampleController {
	// これからメソッド書いていくよ!

ポイントはクラスに付けてるアノテーション「@EnableAutoConfiguration」。
このアノテーションが付くことで「Spring Bootよ!面倒な設定は任せた!」という
殿様的な伝令が発せられ、疲弊した開発者は面倒な設定から解放される。

4. リクエストを受け付けるメソッドを作る

Controllerクラスにリクエストを受け付けるメソッドを作っていく。
メソッドの戻り値はListでもHashMapでも独自クラスでも何でも良い。
指定したクラスの中身がJSONになってクライアントに返却されるので
開発対象のサービスの仕様次第で柔軟に変えるとハッピー。

@Controller
@EnableAutoConfiguration
public class SampleController {
	
	@RequestMapping("/service")
	@ResponseBody
	public List<String> top() {
		List<String> list = new ArrayList<String>();
		list.add("太宰");
		list.add("夏目");
		return list;
	}

ポイントはメソッドに付けてるアノテーション
@RequestMappingでは、メソッドに紐付いたURLを設定する。
上のtopメソッドの場合「http://localhost:8080/service」というURLが対応する。
@ResponseBodyは端的にいうと「JSONを返却するよ!」という宣言である。


これらのお膳立てが出来た状態で何らかのクラスを返却してやると
そのクラスの中身がJSONに変換されてクライアントに送られる動きになる。

クライアントからのリクエストパラメータを元に
何か処理を制御したい場合、@RequestParamアノテーションを駆使して、
valueでパラメータ名、その後のメソッド引数に対応する型と変数名を
指定してやることでメソッド内で簡単にパラメータを扱うことが出来る。

@Controller
@EnableAutoConfiguration
public class SampleController {
	
	@RequestMapping("/service")
	@ResponseBody
	public List<String> top(@RequestParam(value="name", required=false) String name) {
		List<String> list = new ArrayList<String>();
		if (name == "hoge") {
			list.add("芥川");
		} else {
			list.add("江戸川乱歩");
		}
		list.add("太宰");
		list.add("夏目");
		
		return list;
	}

4. mainメソッドを作る

Spring Bootを使ったアプリは、コンソールのJavaプログラムのように
mainメソッドから実行される仕様であるため、mainメソッドを作っていく。

	public static void main(String args[]) {
		SpringApplication.run(SampleController.class, args);
	}

mainメソッドでは、SpringApplication.runメソッドを実行する。
引数になるのは最初に作ったControllerクラスである。

5. 実行する

「mvn spring-boot:run」で実行する。
コンソールにSpring Bootのロゴやらログが表示される。
最後に「Started SampleController in 2.326 seconds」とか出たら成功。

6. アクセスしてみる

http://localhost:8080/service」にリクエストを送ってみる。
上手くいけば以下のようにブラウザで結果が見て取れる。

f:id:cross-xross:20150331215249p:plain

オマケ. 単体で実行可能なjarファイルを作る

pom.xmlに追加設定を加えれば単体実行可能な.jarファイルも作成出来る。

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <mainClass>jp.co.cross_xross.controller.SampleController</mainClass>
        </configuration>
      </plugin>
    </plugins>
  </build>

mainClassにmainメソッドを実装したクラス名を指定するところがミソ。


この状態で「mvn package」を実行すると
targetディレクトリに単体実行可能な.jarファイルが生成される。
実行する場合は「java -jar xxxx.jar」で良いので非常に簡単。