Dropwizard(REST)でHello World

はじめに

  • 最小構成で作ります

環境

  • IntelliJ
  • Java8
  • dropwizard 1.1.4
    • 普段はSpringboot使ってる

プロジェクト作成

まずはmavenプロジェクトを作成。

pom.xmlの編集

依存関係でdropwizard-coreを追加します。

<?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>demo-dropwizard</groupId>
    <artifactId>demo-dropwizard</artifactId>
    <version>1.0-SNAPSHOT</version>

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

IntelliJが依存解決してくれるまで少し待ちます。

application.ymlの作成

アプリのコンフィグ。今回はポート8080で起動させます。

server:
  applicationConnectors:
    - type: http
      port: 8080

logging:
  level: DEBUG
  appenders:
    - type: console
      timeZone: JST

それを読み込む用のクラスを作成。ひとまず最小限で立ち上げたいので、記述なし(作らないと起動しないので、作る)

configパッケージを作成、その配下に以下のクラスを作成します。

package demo.config;

import io.dropwizard.Configuration;

public class ApplicationConfiguration extends Configuration {
}

Mainクラス作成

mainクラスには先ほどのコンフィグクラスを記述します。

package demo;

import io.dropwizard.Application;
import io.dropwizard.setup.Environment;
import resources.ApplicationConfiguration;
import resources.TopResource;

public class DemoApplication  extends Application<ApplicationConfiguration> {
    public static void main(String[] args) throws Exception {
        new DemoApplication().run(args);
    }

    public void run(ApplicationConfiguration configuration, Environment environment) throws Exception {
    }
}

Resourceクラス作成

resourcesパッケージを作成し、その配下に以下のクラスを作成します。
今回は/topというURLにアクセスした際に、{message: Hello World}のJSONを返すようにします。

package demo.resources;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/top")
@Produces(MediaType.APPLICATION_JSON)
public class TopResource {
    @GET
    public String sayHello() {
        return  "{message: Hello World}";
    }
}

Resourceクラスを認識させる

mainクラスに1行追加します。

package demo;

import io.dropwizard.Application;
import io.dropwizard.setup.Environment;
import resources.ApplicationConfiguration;
import resources.TopResource;

public class DemoApplication  extends Application<ApplicationConfiguration> {
    public static void main(String[] args) throws Exception {
        new DemoApplication().run(args);
    }

    public void run(ApplicationConfiguration configuration, Environment environment) throws Exception {
        environment.jersey().register(new TopResource()); //追加
    }
}

実行

mainクラスを実行すると

usage: java -jar project.jar [-h] [-v] {server,check} ...

positional arguments:
  {server,check}         available commands

optional arguments:
  -h, --help             show this help message and exit
  -v, --version          show the application version and exit

引数の指定が必要みたいなので、
実行引数にserver application.ymlを足してあげます。
RUN → Edit Configurations → Program argumentsから設定できます。

設定したら実行。

INFO  [2017-09-25 18:46:18,360] org.eclipse.jetty.server.Server: Started @2448ms

が表示されれば起動完了。

ブラウザからhttp:localhost:8080/topにアクセスするとJSONが返ります。

期待通りです。

おまけ

src/main/resources/にbanner.txtを追加して、起動時に表示させてみます。

.
├── application.yml
├── pom.xml
└── src
    └── main
        ├── java
        │   └── com
        │       └── demo
        │           ├── config
        │           |   └── ApplicationConfiguration.java
        │           ├── resources
        │           |   └── TopResource.java
        │           └── DemoApplication.java
        └── resources
            └── banner.txt //追加

banner.txtの中身はこんなカンジにしてみます。
弊社の英語表記ASNPCE

 .----------------.  .----------------.  .-----------------. .----------------.  .----------------.  .----------------. 
| .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. |
| |      __      | || |    _______   | || | ____  _____  | || |   ______     | || |     ______   | || |  _________   | |
| |     /  \     | || |   /  ___  |  | || ||_   \|_   _| | || |  |_   __ \   | || |   .' ___  |  | || | |_   ___  |  | |
| |    / /\ \    | || |  |  (__ \_|  | || |  |   \ | |   | || |    | |__) |  | || |  / .'   \_|  | || |   | |_  \_|  | |
| |   / ____ \   | || |   '.___`-.   | || |  | |\ \| |   | || |    |  ___/   | || |  | |         | || |   |  _|  _   | |
| | _/ /    \ \_ | || |  |`\____) |  | || | _| |_\   |_  | || |   _| |_      | || |  \ `.___.'\  | || |  _| |___/ |  | |
| ||____|  |____|| || |  |_______.'  | || ||_____|\____| | || |  |_____|     | || |   `._____.'  | || | |_________|  | |
| |              | || |              | || |              | || |              | || |              | || |              | |
| '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' |
 '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------' 

banner.txtを配置して再実行するとコンソールに…

でましたね!!
あまり表に見えるものではないですが、ちょっとばかしやる気が上がる気がします。

次回(予定)

今回はレスポンスのJSONを文字列で返しましたが、エンティティを使って返却するようにします。
併せてDBアクセスも書こうと思います。

では

サーバサイドエンジニア。オムライスが好物

シェアする

  • このエントリーをはてなブックマークに追加

フォローする