tamuraです。

JavaでJSONを話すサーバを作ろうと思ったら、Dropwizardを使うのがかなりお手軽ではないかと思います。
Dropwizardを使ってhelloworldをやって行きます。

http://www.dropwizard.io/getting-started.html

この内容をほぼそのままやって行きます。


pom.xml

もしMavenを使っているなら以下のようにpom.xmlを作ってください。 Gradleなどを使っている場合は、pom.xmlをどう変更すればいいかわかると思いますので割愛します。

shadeプラグインを使って、一つの大きなJarファイル(FatJar)にしています。
こうすることで実行が楽になります。

<?xml version="1.0" encoding="UTF-8"?>  
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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.github.tamurashingo.dropwizard</groupId>
  <artifactId>helloworld</artifactId>
  <version>0.0.1-SNAPSHOT</version>


  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <dropwizard.version>0.8.1</dropwizard.version>
  </properties>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.1</version>
          <configuration>
            <source>1.7</source>
            <target>1.7</target>
            <encoding>UTF-8</encoding>
          </configuration>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <createDependencyReducedPom>true</createDependencyReducedPom>
          <filters>
            <filter>
              <artifact>*:*</artifact>
              <excludes>
                <exclude>META-INF/*.SF</exclude>
                <exclude>META-INF/*.DSA</exclude>
                <exclude>META/INF/*.RSA</exclude>
              </excludes>
            </filter>
          </filters>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <mainClass>com.github.tamurashingo.dropwizard.helloworld.HelloWorldApplication</mainClass>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <dependencies>
    <dependency>
      <groupId>io.dropwizard</groupId>
      <artifactId>dropwizard-core</artifactId>
      <version>${dropwizard.version}</version>
    </dependency>
  </dependencies>
</project>  

Configuration

設定を外部に切り出したいときなどに使います。なんか無いとだめっぽいので、作ります。 ここではメッセージを外出しにしています。

package com.github.tamurashingo.dropwizard.helloworld;

import com.fasterxml.jackson.annotation.JsonProperty;  
import io.dropwizard.Configuration;

public class HelloWorldConfiguration extends Configuration {  
    private String message;

    @JsonProperty
    public void setMessage(String message) {
        this.message = message;
    }

    @JsonProperty
    public String getMessage() {
        return this.message;
    }
}

Application

エントリーポイントです。 runHelloWorldResourceを登録しています。

package com.github.tamurashingo.dropwizard.helloworld;

import io.dropwizard.Application;  
import io.dropwizard.setup.Environment;

public class HelloWorldApplication extends Application<HelloWorldConfiguration> {

    public static void main(String...args) throws Exception {
        new HelloWorldApplication().run(args);
    }

    @Override
    public void run(HelloWorldConfiguration configuration, Environment environment) throws Exception {
        environment.jersey().register(new HelloWorldResource(configuration.getMessage()));
    }
}

Resource

外部に公開するリソースです。 /hello-worldというパスで起動するようにアノテーションを設定します。

sayHelloGETでアクセスされた時に動くメソッドです。 nameという名前でパラメータを受け取ります。パラメータを受け取らない場合は「ななし」という名前になります。

package com.github.tamurashingo.dropwizard.helloworld;

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.google.common.base.Optional;

@Path("/hello-world")
@Produces(MediaType.APPLICATION_JSON)
public class HelloWorldResource {

    private String message;

    public HelloWorldResource(String message) {
        this.message = message;
    }

    @GET
    public Saying sayHello(@QueryParam("name") Optional<String> name) {
        return new Saying(String.format("%s, %sさん", message, name.or("ななし")));
    }
}

JSON

最後にJSONオブジェクトを定義します。

{
  greeting: 'こんにちは, ○○さん'
}

ここでは上のようなI/Fにします。

package com.github.tamurashingo.dropwizard.helloworld;

import com.fasterxml.jackson.annotation.JsonProperty;

public class Saying {

    private String greeting;

    public Saying() {
    }

    public Saying(String greeting) {
        this.greeting = greeting;
    }

    @JsonProperty
    public String getGreeting() {
        return this.greeting;
    }
}

外部ファイル

こんな感じで用意しました。

message: こんにちは  

ビルドして実行

mvn package  

で一気にFatJarまで作ってしまいます。

java -jar target/helloworld-0.0.1-SNAPSHOT.jar server hello-world.yml  

で起動します。 jettyを内蔵しているのでそのままサーバとして動きます。

ブラウザから

http://localhost:8080/hello-world

にアクセスすると

{"greeting":"こんにちは, ななしさん"}

と返ってきます。

http://localhost:8080/hello-world?name=tamura

にアクセスすると

{"greeting":"こんにちは, tamuraさん"}

と返ってきます。