JAXRS GET方法的多个参数
问题描述:
我正在使用java(Netbeans IDE)创建宁静的服务。我从两个相关的表中创建了两个实体类。我也从模式创建了宁静的服务。我已经使用了Container-Item设计模式。我需要从单个Container调用两个以上的资源。我也做了下面的代码JAXRS GET方法的多个参数
CategoriesResource.java
@Path("/categories")
public class CategoriesResource {
@Context
private UriInfo context;
EjbLookup lookup=new EjbLookup();
CategoryFacade categoryFacade=lookup.lookupCategoryFacadeBean();
public CategoriesResource() {
}
@GET
@Produces("application/json")
public List<Category> getAllCategories() {
List<Category> categoryList;
categoryList=categoryFacade.findAll();
return categoryList;
}
@POST
@Consumes("application/json")
@Produces("application/json")
public Response addCategory(Category content) {
categoryFacade.create(content);
return Response.created(context.getAbsolutePath()).build();
}
// @Path("{category}")
// public CategoryResource getCategoryResource(@QueryParam("category") String category) {
// return CategoryResource.getInstance(category);
// }
//when I uncomment these four lines of code it gives an exception java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: org.apache.catalina.LifecycleException: com.sun.jersey.spi.inject.Errors$ErrorMessagesException
@Path("{siteID}")
public CategoryBySiteResource getCategoryBySiteResource(@QueryParam("siteId") Integer site) {
return CategoryBySiteResource.getInstance(site);
}
}
CategoryBySiteResource.java
public class CategoryBySiteResource {
private Integer site;
EjbLookup lookup=new EjbLookup();
CategoryFacade categoryFacade=lookup.lookupCategoryFacadeBean();
private CategoryBySiteResource(Integer site) {
this.site = site;
}
public static CategoryBySiteResource getInstance(Integer site) {
return new CategoryBySiteResource(site);
}
@GET
@Produces("application/json")
public List<Category> getCategoryById() {
return categoryFacade.retrieveCategory(site);
}
}
CategoryResource.java
public class CategoryResource {
private String category;
EjbLookup lookup=new EjbLookup();
CategoryFacade categoryFacade=lookup.lookupCategoryFacadeBean();
private CategoryResource(String category) {
this.category = category;
}
public static CategoryResource getInstance(String category) {
return new CategoryResource(category);
}
@GET
@Produces("application/json")
public Category getCategoryById() {
return categoryFacade.find(Integer.parseInt(category));
}
@PUT
@Consumes("application/json")
public void updateCategory(Category content) {
categoryFacade.edit(content);
}
@DELETE
public void deleteCategoryById() {
}
}
答
你的每个子资源定位器需要有一条独特的道路。但是您要为解析为相同URL的每个指定一个路径参数。请注意,如果您为路径参数指定了不同的名称,则无关紧要,因为路径参数名称仅在URL->方法参数映射的上下文中有用。从URL解析的角度来看,它们是一样的。
Root Relative Path: /categories
Sub Resource Path1: /{category}
Sub Resource Path2: /{siteID}
给出的网址,例如,http://www.example.com/categories/10
,运行时不能确定阉调用子资源的方法getCategoryResource
或getCategoryBySiteResource
,因为他们是都资格的比赛。
为了解决这个问题,您需要为每个子资源方法提供唯一的路径名。