2

这个简单的根资源类在 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 实现:-(

4

1 回答 1

1

JAX-RS如果您使用orTomEE+版本,请记住,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));
    }
}
于 2014-04-18T13:08:46.267 回答