JAX-RSアプリケーションと対応コンテナ

JavaによるRESTfulシステム構築

JavaによるRESTfulシステム構築

によると

Java EE 6の場合、サーブレットコンテナはJAX-RS対応となり、web.xml内にApplicationクラスをサーブレットして宣言する記述を省略することが可能。Applicationクラスが存在しない場合、@Pathまたは@ProviderであのテートされたクラスがWARファイル内で検索される。

と書いてある。

しかし

@Path("/hello")
public class HelloResource {
	@GET
	@Produces(MediaType.TEXT_PLAIN)
	public String sayHello() {
		return "hello this is jax-rs application.";
	}
}

をそのままGlassFish v3サーバにデプロイしても404である。

試しに本の通り

public class JaxRsApplication extends Application{
	
	public Set<Class<?>> getClasses(){
		HashSet<Class<?>> set = new HashSet<Class<?>>();
		set.add(HelloResource.class);
		return set;
	}
	
}

Applicationクラスをつくり

	<servlet>
		<servlet-name>Jersey REST Service</servlet-name>
		<servlet-class>jaxrs.JaxRsApplication</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>Jersey REST Service</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping> 

web.xmlに登録。

すると今度は500に変わった。エラーが。

javax.servlet.ServletException: PWC1403: Class jaxrs.JaxRsApplication is not a Servlet

ちなみにJAX-RS実装たちは
Project Facets > JAX-RS(REST Web Services)1.1
をチェックすることでJAX-RS GlassFish Libraryを使用している。

GlassFish v3ってJAX-RS対応コンテナのはずだよなー。なんか足りない?

最終手段。
JAX-RS非対応コンテナ用にweb.xmlの記述を書いてみる。

	<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>jaxrs.JaxRsApplication</param-value>
		</init-param>		
	</servlet>
	<servlet-mapping>
		<servlet-name>Jersey REST Service</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping>

いけた。

・・・うーんと。非対応ナンデスカ?

開発環境は結局
Eclipse3.5Eclipse3.6+GlassFish v3(Java EE 6対応)

それとも何かまだ設定が足りないのかな。。