错误404访问JAX-RS Jersey中的SubResource

时间:2017-04-23 07:26:56

标签: java rest jersey jax-rs

我有这两个资源

@Path("/orders")
public class OrderResource {

    @GET
    @Path("/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getOrder(@PathParam("id") String orderid)
            throws JSONException {
        Order order = db.getOrder(orderid);
        return Response.status(Status.OK).entity(order).build();
    }

    @GET
    @Path("/{orderid}/products")
    public ProductResource getProducts() {
        return new ProductResource();
    }

}

@Path("/")
public class ProductResource {

    @GET
    @Path("/{productid}")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getProduct(@PathParam("orderid") String orderid, @PathParam("productid") String productid) throws JSONException {
        Product product = db.getProduct(productid);
        return Response.status(Status.OK).entity(product).build();
    }
}

当我这样做时,我得到了一个成功的输出:

http://localhost:8080/testApp/api/orders/O101

我可以在输出中看到链接到订单的产品集合,所以我复制了id并尝试了这个

http://localhost:8080/testApp/api/orders/O101/products/P101

但我总是得到404错误。为什么?我该如何解决这个问题?

这是我在web.xml中的配置

 <servlet-mapping>
    <servlet-name>TestApp</servlet-name>
    <url-pattern>/api/*</url-pattern>
  </servlet-mapping>  

修改

非常感谢您的回答。今天早上醒来累了测试它没有成功。

我尝试了你的建议,但仍然得到了404。

@Path("/orders")
public class OrderResource {

    @GET
    @Path("/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getOrder(@PathParam("id") String orderid)
            throws JSONException {
        Order order = db.getOrder(orderid);
        return Response.status(Status.OK).entity(order).build();
    }

    @GET
    @Path("/{orderid}/products") //Here I added after products /{productID} which gives me an empty JSON. Never reach the method from the subresource.
    public ProductResource getProducts() {
        return new ProductResource();
    }

}

public class ProductResource {

    @Path("/{productid}")  //Here I tried to remove the slash also.
    @Produces(MediaType.APPLICATION_JSON)
    public Response getProduct(@PathParam("orderid") String orderid, @PathParam("productid") String productid) throws JSONException {
        Product product = db.getProduct(productid);
        return Response.status(Status.OK).entity(product).build();
    }
}

3 个答案:

答案 0 :(得分:0)

不应在类级别使用@Path注释子资源,并且需要使用JAX-RS runtinme注册它们。

只需删除@Path注释。

答案 1 :(得分:0)

在您的情况下,问题似乎是子资源中的注释@Path。定义子资源时,不应在类级别使用@Path进行注释。同样在您的ProductResource中,尝试删除&#39; /&#39;来自@Path(&#34; / {productid}&#34;),因为它应该从父(OrderResource)的上下文引用,不应该作为单个实例存在。

由于

答案 2 :(得分:0)

问题是@GET上的getProducts。子资源定位器被定义为具有@Path并且 @METHOD的方法。如果你考虑一下,它就非常有意义,因为在子资源类中只有一个@GET。所以删除@GET,它应该有效。离开它将导致该方法不是一个子资源定位器,它的行为就像一个普通的资源方法。

除此之外,其他人对@Path("/")提出的建议不是问题的原因,但 是一个问题。这样做是因为Jersey还将ProductsResource注册为根资源。因此可以访问/api/1234,因为它已映射到/。你可能不想要这个。因此,您应该从@Path("/")删除ProductsResource