Jersey:ApplicationPath、Applicationの自動認識は使いものにならない?

2019年7月24日

あちこちのウェブを見てみると、わざわざ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());
  }
}

参考