如何使用JAX-RS实现返回的子资源

时间:2014-03-31 06:29:30

标签: java dependency-injection jax-rs

让我们假设我们有这样的URI模式:

/shop/categories
/shop/categories/{categoryId}
/shop/categories/{categoryId}/products
/shop/categories/{categoryId}/products/{productId}

最后一个可能看起来很奇怪,因为使用它会更直观:

/shop/products/{productId}

但这只是一个例子。类别和产品不是我系统中的真实资源。

我想将它实现为两个JAX-RS类:

@Path("/shop/categories")
@Stateless
@Produces("application/xml")
public class CategoryResource {

    @EJB
    Shop shop;

    @GET
    public List<String> get() {
        return shop.getCategories();
    }

    @Path("{categoryId}")
    @GET
    public String getCategory(@PathParam("categoryId") int id) {
        return shop.getCategory(id);
    }

    @Path("{categoryId}/products")
    public CategoryProductResource getCategoryProducts(@PathParam("categoryId") int id) {
        return new CategoryProductResource(id);
    }
}

@Produces("application/xml")
@Stateless
public class CategoryProductResource {

    @EJB
    Shop shop;

    int categoryId;

    public CategoryProductResource(){}

    public CategoryProductResource(int categoryId) {
        this.categoryId = categoryId;
    }

    @GET
    public List<String> get() {
        return shop.getProductsOfCategory(categoryId);
    }

    @Path("{id}")
    @GET
    public String getCategoryProduct(@PathParam("id") int id) {
        return shop.ProductOfCategory(id, categoryId);
    }
}

但问题是Shop没有注入CategoryProductResource。 注入Shop比将其传递给构造函数更好吗?

1 个答案:

答案 0 :(得分:4)

使用JAX-RS 2.0,您可以执行以下操作:

@Path("{categoryId}/products")
public CategoryProductResource getCategoryProducts(
             @PathParam("categoryId") int id,
             @Context ResourceContext rc) {
    return rc.initResource(new CategoryProductResource(id));
}

在这种情况下,我认为@Stateless上不需要CategoryProductResource注释。

HTH。