この単純なルート リソース クラスは、TomEE+ 1.5.1 で実行すると失敗し、「要求されたリソースは利用できません」という 404 エラーが返されます。これは、WEB-INF 内の空の web.xml ファイルを含む WAR としてパッケージ化されています。
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
@Path("/")
@Produces({ "text/plain", "text/html", "text/xml", "application/xml", "application/json" })
public class BrokenResource {
private static final Log logger = LogFactory.getLog(BrokenResource.class);
public BrokenResource()
{
logger.info("constructed");
}
@GET
@Path("getloggedinguids")
public Response foo(@Context UriInfo uInfo)
{
return Response.ok("\n\n\nrequest URI = " + uInfo.getRequestUri()).build();
}
}
デプロイされ、コンソール出力に次の行が表示されます。
Mar 22, 2013 4:56:16 PM org.apache.openejb.server.rest.RESTService deployPojo
INFO: REST Service: http://localhost:8080/test//* -> Pojo BrokenResource
また、次を宣言する web.xml でパッケージ化しようとしました。
<servlet>
<servlet-name>test</servlet-name>
<display-name>Test OpenEJBRest Servlet</display-name>
<servlet-class>
org.apache.openejb.server.rest.OpenEJBRestServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
空の web.xml ファイルの場合と同じ結果になります。
また、クラス レベルの @Path アノテーションを @Path("*") に変更してみましたが、別の応答が返され、コンソール出力に次の行が表示されます。
WARNING: No root resource matching request path /test/getloggedinguids has been found, Relative Path: /getloggedinguids.
最後に... @Path アノテーションを @Path("/foo") のようなものに変更すると、期待どおりに機能します... /test/foo/getloggedinguids を押すと、リクエスト URI が返されます。
私はサーブレット マッピングとクラス レベルのアノテーションのあらゆる種類のバリエーションを試してきましたが、1 つのことは一貫しています... クラス レベルの @Path("/") アノテーションは常に失敗します。
クラスレベルで @Path("/") を使用する「RESTful Java with JAX-RS book」から例を取得しました...これも失敗します。
これは JAX-RS 標準の CXF 実装のバグですか? 私のプロジェクトでは、ストック TomEE+ コンテナーを使用する必要があるため、別の JAX-RS 実装に切り替えることはできません :-(