JerseyでHello World
Mavenでサンプルプロジェクトを作成する。
mvn archetype:generate -DgroupId=jp.sample -DartifactId=JerseyHelloWorld -Dversion=1.0.0 -DarchetypeArtifactId=maven-archetype-webapp
POMを下記のように作成。
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>jp.sample</groupId> <artifactId>JerseyHelloWorld</artifactId> <packaging>war</packaging> <version>1.0.0</version> <name>JerseyHelloWorld Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <!-- Generic properties --> <jdk.version>1.7</jdk.version> <encoding>UTF-8</encoding> <!-- Jersey --> <jersey.version>1.17.1</jersey.version> </properties> <build> <finalName>Spring3HelloWorldJerseyJSON</finalName> <plugins> <!-- compiler --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>${jdk.version}</source> <target>${jdk.version}</target> <encoding>${encoding}</encoding> </configuration> </plugin> </plugins> </build> <dependencies> <!-- Jersey --> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-core</artifactId> <version>${jersey.version}</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-servlet</artifactId> <version>${jersey.version}</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-json</artifactId> <version>${jersey.version}</version> </dependency> </dependencies> </project>
次に以下を作成する。
- リソースクラス(jp.sample.resource.HelloResource)
- HTTPリクエストに対する処理を実行するクラス。
- @Pathや@Getアノテーションを使用する。
- アプリケーションクラス(jp.sample.application.HelloApplication)
- web.xml
■リソースクラス(jp.sample.resource.HelloResource)
package jp.sample.resource; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Path("/hello") public class HelloResource { @GET @Produces(MediaType.TEXT_PLAIN) public String sayHello() { return "Hello World"; } }
■アプリケーションクラス(jp.sample.application.HelloApplication)
package jp.sample.application; import java.util.HashSet; import java.util.Set; import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; import jp.sample.resource.HelloResource; @ApplicationPath("") public class HelloApplication extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> s = new HashSet<Class<?>>(); s.add(HelloResource.class); return s; } }
■web.xml(JAX-RX非対応のコンテナの場合)
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>javax.ws.rs.Application</param-name> <param-value>jp.sample.application.HelloApplication</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> </web-app>
上記の例はTomcatのようにJAX-RS非対応のコンテナの場合の記述方法。
GlassFishのようにJAX-RS対応のコンテナの場合は下記。
■web.xml(JAX-RX対応のコンテナの場合)
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>jp.sample.application.HelloApplication</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> </web-app>
また、アプリケーションクラス(jp.sample.application.HelloApplication)を使用しなくてもデプロイ対象のリソースクラスをJAX-RSへ教えることができる。
サーブレットの定義に「com.sun.jersey.config.property.packages」パラメタを使用してリソースクラスがあるパッケージを教えてあげる。
■web.xml(JAX-RX非対応のコンテナ、且、アプリケーションクラス使用しない場合)
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <!-- リソースクラスだけでなくプロバイダクラスのパッケージも指定可能 --> <!-- 複数指定したい場合は「;」で区切る --> <param-value>jp.sample.resource</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> </web-app>
上記でデプロイが成功すると起動時に下記のようなログが標準出力される。(Tomcat)
情報: Root resource classes found: class jp.sample.resource.HelloResource
プロバイダクラスを見つけた場合は下記のようなログが出力される。
情報: Provider classes found: class org.sample.provider.JsonListMapMessageBodyWriter class org.sample.provider.JsonMapMessageBodyWriter class org.sample.provider.JsonMapMessageBodyReader class org.sample.provider.JsonListMapMessageBodyReader
プロバイダクラスについては下記。
以上でサンプル実装完了。
サンプルを起動した後ブラウザで「http://[FQDN]:8080/JerseyHelloWorld/rest/hello」へアクセスすると「Hello World」表示される。