Dropwizard に学ぶ / Jersey ResourceConfig

  • 6
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Hello World

Jersey-1.x での Hello World です。

src/main/java/app/resources/AppResource.java
package app.resources;

import javax.ws.rs.*;
import javax.ws.rs.core.*;

@Path("/")
public class AppResource {
    private final String message;

    public AppResource() {
        message = "Hello World!";
    }

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

    @GET
    @Path("hello")
    @Produces(MediaType.TEXT_PLAIN)
    public Response hello() {
        return Response.ok(message).build();
    }
}
src/main/java/app/AppResourceConfig.java
package app;

import com.sun.jersey.api.core.PackagesResourceConfig;

public class AppResourceConfig extends PackagesResourceConfig {
    public AppResourceConfig() {
        super("app.resources");
    }
}
web.xml
<web-app>
  <filter>
     <filter-name>Jersey Web Application</filter-name>
     <filter-class>com.sun.jersey.spi.container.servlet.ServletContainer</filter-class>
     <init-param>
         <param-name>javax.ws.rs.Application</param-name>
         <param-value>app.AppResourceConfig</param-value>
     </init-param>
   </filter>
   <filter-mapping>
     <filter-name>Jersey Web Application</filter-name>
     <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>
pom.xml
...
<properties>
  <jersey.version>1.18.1</jersey.version>
  ...
</properties>
<dependencies>
  <dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-server</artifactId>
    <version>${jersey.version}</version>
  </dependency>
  <dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-servlet</artifactId>
    <version>${jersey.version}</version>
  </dependency>
  ...
</dependencies>
...

ResourceConfig

PackagesResourceConfig を使えば、指定パッケージ内のリソースをまとめて読むことができますが、コンストラクタに引数を渡すことができません。代わりに ScanningResourceConfig を使うことで、コンストラクタ内で getSingleton で管理下のインスタンスを取り出して、リソースのインスタンスを追加することができます。

AppResourceConfig.java
package app;

import com.sun.jersey.api.core.ScanningResourceConfig;

import app.resources.AppResource;

public class AppResourceConfig extends ScanningResourceConfig {
    public AppResourceConfig() {
        getSingleton().add(new AppResource("Hello! Created at " + new java.util.Date()));
    }
}

Dropwizard では、以下のような方法で JerseyEnvironment#register でリソースを登録しますが、結果的には ScanningResourceConfig を継承した DropwizardResourceConfig を経由して、同じ方法で追加されることになります。

@Override
public void run(HelloConfiguration config,
                Environment environment) {
    HelloService helloService = config.getHelloServiceFactory.build();
    environment.jersey().register(new HelloResource(helloService));
}

Dropwizard では、DI コンテナに頼らずに、シンプルにコンストラクタ引数で依存オブジェクトを渡す慣習になっています。登録するリソースが多くなると一つ一つ書くのは手間ですが、リソースクラスからインジェクション関連のアノテーションを排除することができ、依存ライブラリも少なくてすみます。