在类级别使用@Path(“/”)的JAX-RS Web服务在TomEE + 1.5.1上失败

时间:2013-03-22 21:35:27

标签: cxf jax-rs java-ee-6 apache-tomee

在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实现: - (

1 个答案:

答案 0 :(得分:1)

请注意,如果您使用JAX-RSTomEE+版本,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));
    }
}