Jersey:ApplicationPath、Applicationの自動認識は使いものにならない?
あちこちのウェブを見てみると、わざわざweb.xmlに記述しなくても、ウェブリソースを認識してくれるのだという。
ApplicationPath/Applicationが自動では認識されない
手動で認識させる場合
例えばこうだ。
web.xml
<servlet>
<servlet-name>jaxrs-api</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>foo.bar.webServer.apiSample</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>jaxrs-api</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
Employees.java
package foo.bar.webServer.apiSample;
import javax.ws.rs.*;
import javax.ws.rs.core.*;
@Path("/employees")
public class Employees {
@Path("/{id}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Employee getById(@PathParam("id") int id) {
return ...;
}
}
自動認識させる場合
しかし、以下のようにすれば、web.xmlへの記述は不要なのだという。これはApplicationに限らず、ResourceConfigも同じだという。
Employees.java
package foo.bar.webServer.apiSample;
import javax.ws.rs.*;
import javax.ws.rs.core.*;
@ApplicatonPath("/employees")
public class Employees extends Application {
@Path("/{id}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Employee getById(@PathParam("id") int id) {
return ...;
}
}
しかし、これがどうやっても動かないのだ。
Embedded Jettyでは動作しない
少なくともEclipse開発環境でJettyを使った場合には認識されなかった。
以下にバグとして報告されている。
が、後述する参考文献によれば、META-INF/services下に何らかのファイルを置く必要があるのだという。追求していないが、この方法はやめた。
しかしResourceConfigが無いとセットアップができないように思える
実はApplication/ResourceConfigは手動で認識させる方法があった。
以下のようにweb.xmlでは、リソースクラスを指定し、
<servlet>
<servlet-name>jaxrs-api</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>foo.bar.webServer.apiSample.JerseyConfig</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>jaxrs-api</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
</web-app>
リソースクラスにおいて、ウェブリソースのパッケージを指定する(この場合は同じパッケージ)。
JerseyConfig.java
package foo.bar.webServer.apiSample;
import org.glassfish.jersey.server.*;
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
packages(JerseyConfig.class.getPackageName());
}
}
ディスカッション
コメント一覧
まだ、コメントがありません