2014年2月23日日曜日

【Java】SpringFrameworkを使って簡単なWebAPIを作成してみた

■環境
Mac OSX 10.8.5
Eclipse Kepler 4.3
Java 1.6.0_65
Maven 3.1.1
SpringFramework 4.0.3

■環境準備
1. Mavenプロジェクトを作成する
eclipseを開き New -> Other -> MavenProject を選択し Next をクリックします


次もデフォルトのままNextをクリックします


プロジェクトのarchetypeを設定します
GroupIdがorg.apache.maven.archetypes、ArtifactIdがmaven-archetype-quickstart を選択します


作成するプロジェクトのGroupIdとArtifactIdを選択する画面になりますので適当に入力します
ここでは以下の通り入力しました
  • GroupId・・・com.kakakikikeke.sample
  • ArtifactId・・・java-spring-sample
パッケージ名は自動で生成されるのでjava-spring-sampleの部分を削除しました

入力が完了したらFinishをクリックします

2. pom.xmlの作成
以下の内容のpom.xmlを作成します
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelversion>4.0.0</modelversion>

     <groupid>com.kakakikikeke.sample</groupid>
     <artifactid>java-spring-sample</artifactid>
     <version>1.0</version>
     <packaging>jar</packaging>

     <name>java-spring-sample</name>
     <url></url>

     <properties>
          <project .build.sourceencoding="">UTF-8</project>
          <start-class>com.kakakikikeke.sample.Application</start-class>
     </properties>

     <parent>
          <groupid>org.springframework.boot</groupid>
          <artifactid>spring-boot-starter-parent</artifactid>
          <version>1.0.0.RC3</version>
     </parent>

     <dependencies>
          <dependency>
               <groupid>junit</groupid>
               <artifactid>junit</artifactid>
               <scope>test</scope>
          </dependency>
          <!-- for spring -->
          <dependency>
               <groupid>org.springframework.boot</groupid>
               <artifactid>spring-boot-starter-web</artifactid>
          </dependency>
          <dependency>
               <groupid>com.fasterxml.jackson.core</groupid>
               <artifactid>jackson-databind</artifactid>
          </dependency>
     </dependencies>

     <build>
          <plugins>
               <plugin>
                    <artifactid>maven-compiler-plugin</artifactid>
               </plugin>
               <plugin>
                    <groupid>org.springframework.boot</groupid>
                    <artifactid>spring-boot-maven-plugin</artifactid>
               </plugin>
          </plugins>
     </build>

     <repositories>
          <repository>
               <id>spring-snapshots</id>
               <url>http://repo.spring.io/libs-snapshot</url>
               <snapshots>
                    <enabled>true</enabled>
               </snapshots>
          </repository>
     </repositories>
     <pluginrepositories>
          <pluginrepository>
               <id>spring-snapshots</id>
               <url>http://repo.spring.io/libs-snapshot</url>
               <snapshots>
                    <enabled>true</enabled>
               </snapshots>
          </pluginrepository>
     </pluginrepositories>
    
</project>
springのライブラリのダウンロードとmavenビルド時に必要なgoalsを使用するためにプラグインを追加しています
junitのdependencyに関しては削除しても問題ありません(maven-archetype-quickstartから作成すると自動で追加されてしまうものです)
properties.start-classの値に関してはパッケージ名やこのあと作成するApplicationクラスの名称が異なる場合には適宜変更してください

3. クラス作成
以下3つのクラスファイルを作成したパッケージ配下に作成してください
com.kakakikikeke.sample.Greeting.java
package com.kakakikikeke.sample;

public class Greeting {

     private final long id;
     private final String content;

     public Greeting(long id, String content) {
          this.id = id;
          this.content = content;
     }

     public long getId() {
          return id;
     }

     public String getContent() {
          return content;
     }
}
com.kakakikikeke.sample.GreetingController.java

package com.kakakikikeke.sample;

import java.util.concurrent.atomic.AtomicLong;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class GreetingController {

     private static final String template = "Hello, %s!";
     private final AtomicLong counter = new AtomicLong();

     @RequestMapping("/greeting")
     @ResponseBody
     public Greeting greeting(
               @RequestParam(value = "name", required = false, defaultValue = "World") String name) {
          return new Greeting(counter.incrementAndGet(), String.format(template,
                    name));
     }
}
com.kakakikikeke.sample.Application.java

package com.kakakikikeke.sample;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan;

@ComponentScan
@EnableAutoConfiguration
public class Application {

     public static void main(String[] args) {
          SpringApplication.run(Application.class, args);
     }
}
Application.javaは名称を変更した場合はpom.xmlのstart-classの定義も変更してください

4. mavenビルドの実行
Run Configurations からmavenの新規ビルドを作成してください
新規作成画面で以下のように設定します

入力が必要な箇所はName, Base directory, Goalsの3箇所です
入力が完了したら Apply -> Run としてください
ビルドが失敗する場合はGoalsの設定を「mvn clean package spring-boot:repackage」に変更して再度ビルドしてください
target/java-spring-sample-1.0.jarが作成できていればビルド成功となります

5. jarの実行と動作確認
jarの作成が完了したらjarを実行してアプリを起動します
プロジェクトのフォルダに移動してターミナルから以下のコマンドを実行してください
java -jar target/java-spring-sample-1.0.jar
エラーなく起動すれば起動完了です

ターミナルはそのままにしてブラウザでhttp://localhost:8080/greetingにアクセスしてみてください
JSONのレスポンスが返ってくるかと思います
「?name=hoghoge」のようにパラメータを付与するとブラウザの表示も変化するのがわかると思います

以上でSpringFrameworkを使った簡単なAPIの実装は完了です
SpringFrameworkには他にもいろいろな機能が揃っているのでこれをベースに機能の拡充をしていくのもいいかと思います

■参考サイト

0 件のコメント:

コメントを投稿