Spring 2.5でHello World REST (Jersey) +JSON
Spring 2.5、Jersey、JSONを連携して実行してみる。
まずはHelloWorldを出力するプロジェクトの作成。
下記のコマンドを実行。(Maven 3を使用)
mvn archetype:generate -DgroupId=study -DartifactId=Spring25HelloWorldJerseyJSON -DarchetypeArtifactId=maven-archetype-webapp -Dversion=1.0.0
pom.xmlを下記のように作成。
<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>study</groupId> <artifactId>Spring25HelloWorldJerseyJSON</artifactId> <packaging>war</packaging> <version>1.0.0</version> <name>Spring25HelloWorldJerseyJSON Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <org.springframework.version>2.5.6.SEC01</org.springframework.version> <jersey.version>1.12</jersey.version> <junit.version>4.10</junit.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>com.sun.jersey.contribs</groupId> <artifactId>jersey-spring</artifactId> <version>${jersey.version}</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-server</artifactId> <version>${jersey.version}</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-core</artifactId> <version>${jersey.version}</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-json</artifactId> <version>${jersey.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>Spring25HelloWorldJersey</finalName> </build> </project>
次に以下を作成する。
- リソースインターフェース(jp.sample.resource.PersonResource)
- HTTPリクエストに対する処理を記述クラス。
- @Pathや@Getアノテーションを使用する。
- リソースクラス(jp.sample.resource.impl.PersonResourceImpl)
- リソースインターフェースの実装クラス。
- @Componentアノテーションをつけるのを忘れずに。(これをつけるとSpringが見つけてくれる)
- オブジェクトクラス(jp.sample.vo.Person)
- JSON対応したオブジェクトクラス。
- applicationContext.xml
- SpringのBean定義ファイル。
- コンポーネントスキャンを使用する。
- web.xml
- Jerseyが提供するSpring対応サーブレットを登録する。
■リソースインターフェース(jp.sample.resource.PersonResource)
package jp.sample.resource; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import jp.sample.vo.Person; @Path("/person") public interface PersonResource { @GET @Produces({ MediaType.APPLICATION_JSON }) public Person[] getPersons(); @Path("{id}") @GET @Produces({ MediaType.APPLICATION_JSON }) public Person getPerson(@PathParam("id") Integer id); }
■リソースクラス(jp.sample.resource.impl.PersonResourceImpl)
package jp.sample.resource.impl; import jp.sample.resource.PersonResource; import jp.sample.vo.Person; import org.springframework.stereotype.Component; import com.sun.jersey.api.NotFoundException; @Component public class PersonResourceImpl implements PersonResource { private static Person[] persons = { createPerson(1, "suzuki", "Tokyo"), createPerson(2, "satou", "Osaka"), createPerson(3, "tanaka", "Naogya") }; public Person[] getPersons() { return persons; } public Person getPerson(Integer id) { if (id > persons.length) { throw new NotFoundException("No such person."); } return persons[id - 1]; } private static Person createPerson(Integer id, String name, String address) { Person person = new Person(); person.setId(id); person.setName(name); person.setAddress(address); return person; } }
■オブジェクトクラス(jp.sample.vo.Person)
package jp.sample.vo; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Person { private Integer id; private String name; private String address; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
■applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <context:annotation-config /> <context:component-scan base-package="jp.sample" /> </beans>
■web.xml
<!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> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>Jersey Spring Web Application</servlet-name> <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Jersey Spring Web Application</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
以上でサンプル更新完了。
サンプルを起動した後ブラウザで「http://[FQDN]:8080/Spring25HelloWorldJerseyJSON
/person」へアクセスすると下記のJSONが返る。
{"person":[{"address":"Tokyo","id":"1","name":"suzuki"},{"address":"Osaka","id":"2","name":"satou"},{"address":"Naogya","id":"3","name":"tanaka"}]}
ブラウザで「http://[FQDN]:8080/Spring25HelloWorldJerseyJSON
/person/1」へアクセスすると下記のJSONが返る。
{"address":"Tokyo","id":"1","name":"suzuki"}