我有这两个资源
@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();
}
}
答案 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
。