这个简单的根资源类在 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。
我一直在尝试 servlet 映射与类级别注释的各种变体,并且有一点是一致的……类级别的 @Path("/") 注释总是失败。
我什至从“RESTful Java with JAX-RS book”中获取了一个在类级别使用@Path("/") 的示例......这也失败了。
这是 JAX-RS 标准的 CXF 实现中的错误吗?我的项目要求我使用库存的 TomEE+ 容器,因此我无法切换到另一个 JAX-RS 实现:-(