在TomEE + 1.5.1上运行时,此简单根资源类失败,返回404错误“请求的资源不可用”。它在WEB-INF中打包为WAR with empty web.xml文件。
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”)的东西,那么它的工作原理与预期完全一样... hitting / test / foo / getloggedinguids返回请求URI ..
我正在尝试servlet映射与类级别注释的各种变体,有一点是一致的......类leve中的@Path(“/”)注释总是失败。
我甚至从“使用JAX-RS书的RESTful Java”中获取了一个示例,该示例在类级别使用@Path(“/”)...也失败了。
这是JAX-RS标准的CXF实施中的错误吗?我的项目要求我使用库存TomEE +容器,因此我无法切换到另一个JAX-RS实现: - (
答案 0 :(得分:1)
请注意,如果您使用JAX-RS
或TomEE+
版本,TomEE会对JAX-RS提供本机支持,而不是在web.xml中添加条目。
添加这样的类并删除web.xml条目:
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/")
public class NoteTakerApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
return new HashSet<Class<?>>(Arrays.asList(BrokenResource.class, RestExceptionMapper.class, OtherClassesYouMayHave.class));
}
}