9

@Path私はこれが次のように注釈されているクラスを持っています:

@Path("widgets")
@Produces(MediaType.APPLICATION_XML)
public class WidgetResource {

    @GET
    public Response getWidgets(@QueryParam("limit"))
    {
     //This class returns the plural noun, a list of widgets
    //...}

@GET
@Path("widget/{id}")
    public Response getWidgetById(@PathParam("id") long id)
    {
     //This class returns a single widget by id
    //...}

テストクライアントを起動すると、localhost / widgetsは期待どおりにマップされますが、getWidgetByIdメソッドがにマップされる場合localhost/widgets/widget/{id}。これは私が望んでいることではありません-私が欲しいlocalhost/widgets and localhost/widget/{id}

クラスレベルでアノテーションを省略しようとしました@Pathが、JerseyがこのクラスをRESTリソースとして認識できません(クラスレベルにがない限り、ScanningResourceConfigClassNameResourceConfig-の両方をリソースとしてロードできませんでした@Path)。

WidgetResource(醜い)回避策は、クラス間でメソッドをクラスとクラスに分割することだと思いWidgetsResourceます。これらのメソッドは両方とも同じクラスのリソースを共有するため、これはひどい解決策だと思いますが、REST-ful localhost/widget(単一のエンティティの場合)とlocalhost/widgets(複数の場合)が本当に必要です。

何かが足りないのですか?@Pathメソッドに注釈を付けるだけで(動作させることができませんでした)、Jerseyにリソースクラスとしてクラスを取得させる方法はありますか?そうでない場合は、絶対マッピング(@Path(/widget/{id}))またはいくつかを強制できますか?相対マッピング(@Path(../widget/id)-どちらも実際には機能しません-私が求めているもののアナロジーにすぎません。ありがとう!

4

2 に答える 2

11

この部分はあなたが必要とするものについてです:

個人的に、私はあなたのマッピングが奇妙で紛らわしいと思います。このようにしてください:

@Path("widgets")
@Produces(MediaType.APPLICATION_XML)
public class WidgetResource {

  @GET
  public Response getWidgets(@QueryParam("limit")) {
   //This method returns the plural noun, a list of widgets
   // it's also possible to limit the number returned by
   // using a query parameter. You could easily implement
   // pagination by adding further query parameters like
   // 'offset', 'sortOrder', etc.
   //...
  }

  @GET
  @Path("{id}")
  public Response getWidgetById(@PathParam("id") long id) {
    //This method returns a single widget by id
    //...
  }
}

コレクションからオブジェクトをフェッチするために、IDを持つコレクションへのパスを追加するのは自然なことのようです。本当に作る必要はありませんwidgets/widget/{id}。そのwidget部分は明白で不必要です。

これがRESTfulAPIに関する非常に優れたチュートリアル です。apigeeによる「犬にRESTを教える」これは本当に良いビデオだと思います。著者はいくつかの良い点を述べています。そして、ここに同じプレゼンテーションのより長いバージョンへのリンクがあります


この部分はあなたが望むものについてです:

複数形/単数形の二元論を本当に維持したい場合(私は実際にはお勧めしません)、次のようにコードに注釈を付けることができます: しかし、それは本当に醜いです

@Path("/")
@Produces(MediaType.APPLICATION_XML)
public class WidgetResource {

  @GET
  @Path("widgets")
  public Response getWidgets(@QueryParam("limit")) {
   //This method returns the plural noun, a list of widgets
  //...}

  @GET
  @Path("widget/{id}")
  public Response getWidgetById(@PathParam("id") long id) {
    //This method returns a single widget by id
    //...
  }
}
于 2012-06-21T17:53:08.237 に答える
2

私の提案は、パスを次のようにすること "widgets"です"widgets/id/{id}"。または、id以外でクエリを実行することはないとわかっている場合は、2番目のクエリは単純に"widgets/{id}"

私はあなたの道で複数形と単数形を切り替えません。両方で同じタイプのリソースにアクセスするため、ルートは同じである必要があります。2番目の形式は、それをより具体的に指定するためのベクトル化ベースのアプローチです。

于 2012-06-21T17:46:30.673 に答える