0

java (Netbeans IDE) を使用して安らかなサービスを作成しています。関連する 2 つのテーブルから 2 つのエンティティ クラスを作成しました。また、パターンから安らかなサービスを作成しました。Container-Item デザイン パターンを使用しました。単一のコンテナから 2 つ以上のリソースを呼び出す必要があります。私は次のコードを実行しました

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() {


    }
}
4

1 に答える 1

3

各サブリソース ロケーターには、一意のパスが必要です。ただし、同じ URL に解決されるそれぞれのパス パラメーターを指定しています。パス パラメータ名は URL-> メ​​ソッド パラメータ マッピングのコンテキスト内でのみ役立つため、パス パラメータに別の名前を付けても意味がないことに注意してください。URL 解決の観点からは、それらは同じです。

Root Relative Path: /categories
Sub Resource Path1: /{category}
Sub Resource Path2: /{siteID}

たとえば、 の URL が指定された場合、ランタイムはサブ リソース メソッドまたはhttp://www.example.com/categories/10を呼び出すかどうかを判断できません。これらは両方とも適格な一致であるためです。getCategoryResourcegetCategoryBySiteResource

この問題を解決するには、各サブリソース メソッドに一意のパス名を付ける必要があります。

于 2013-02-28T03:49:30.440 に答える