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