ぺーぺーSEのブログ

備忘録・メモ用サイト。

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)
    • デプロイ対象のリソースクラスをJAX-RSへ教えるクラス。
    • web.xmlへ設定が必要。
  • 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」表示される。