2017-04-23 70 views
0

我有这2个资源错误404访问的子资源在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(); 
    } 
} 
+1

我相信OrderResource需要有一个返回ProductResource的子资源。从'getProducts'中删除'@ GET' – Tibrogargan

+1

忘记添加路径参数@PathParam(“orderid”)getProducts中的字符串orderid –

+0

非常感谢您的意见。看看我的编辑。我仍然得到404 –

回答

0

的问题是在getProducts@GET。子资源定位符被定义为具有@Path并且具有@METHOD的方法。如果你仔细想一想,这是非常有意义的,因为在子资源类中可以不只是说一个@GET。所以删除@GET,它应该工作。离开它会导致方法不是一个子资源定位器,它会像一个正常的资源方法。

除此之外,别人有关于@Path("/")的建议是不是问题的原因,但它是一个问题。这样做会导致泽西岛也将ProductsResource注册为根资源。所以将能够访问/api/1234,因为它映射到/。你可能不想要这个。所以你应该从ProductsResource中删除@Path("/")

+0

非常感谢您的宝贵答案。看看我的编辑。我仍然得到了404。 –

+0

1.您没有从'getProducts()'中删除'@ GET'。 2.您需要将'@ GET'添加回子资源类 –

+0

中的方法谢谢。我误解了。有用 –

0

子资源不应该与@Path上一流水平进行注释,他们需要与JAX-RS runtinme注册。

只需删除@Path注释。

+0

非常感谢你的宝贵答案。看看我的编辑。我仍然得到404。 –

0

就你而言,问题似乎是你的子资源中的注解@Path。定义一个子资源时,不应该在@Path级别注释它。同样在您的ProductResource中,尝试从@Path(“/ {productid}”)中删除'/',因为它应该从父级的上下文(OrderResource)中引用,并且不应作为单个实例存在。

感谢

+0

非常感谢您提供宝贵的答案。看看我的编辑。我仍然拿到404. –

+1

哦,我明白了,让我试试一个示例代码,如果成功将与您分享:-) –