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
エントリーポイントです。 run
でHelloWorldResource
を登録しています。
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
というパスで起動するようにアノテーションを設定します。
sayHello
がGET
でアクセスされた時に動くメソッドです。 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さん"}
と返ってきます。