3

私はJersey 1.17.1を使用しており、作成したすべてのURLで、人々が最後に「.json」を配置できるようにしたいと考えています。これが私がやったことの例です:

@GET
@Path("basepath{extension: (\\.json)?}")
public String foobar() {
    ...
}

最終的には、「.json」または「.xml」のいずれかを選択できるようにするつもりですが、ここでの DRY 違反が心配です。代わりに、すべての @Path を次のように変更する必要があります。

@GET
@Path("basepath{extension: (\\.json|\\.xml)?}")
public String foobar() {
    ...
}

パス値をより再利用できるようにする、これを行うためのより良い方法はありますか? 私は Jersey 2.0 を使用できませんが、この問題を解決できるかどうか知りたいです。

4

2 に答える 2

5

これを行う 1 つの方法は、 PackagesResourceConfigをサブクラス化し、Jersey にどの拡張機能をどのメディア タイプにマップするかを通知することです。例えば:

public class ExampleResourceConfig extends PackagesResourceConfig {
  @Override
  public Map<String, MediaType> getMediaTypeMappings() {
    Map<String, MediaType> map = new HashMap<>();
    map.put("xml", MediaType.APPLICATION_XML_TYPE);
    map.put("json", MediaType.APPLICATION_JSON_TYPE);
    return map;
  }
}

実際の REST サービスは次のようになります。

@GET
@Path("basepath")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response foobar() {
  ...   
}

Jersey は、URL 拡張子に基づいて適切なメディア タイプを選択します。Responseの代わりに が返されることに注意してくださいString。応答をどのように構築しているか、また要件が何であるかはわかりませんが、Jersey は Java Bean を XML または JSON (または JSONP) に問題なく変換できます。

于 2013-09-17T23:59:39.007 に答える
0

REST API 実装では、リソース表現は xml または json などのいずれかになります。タイプを URL の拡張子として指定する場合、これは安らかな実装の良い方法ではありません。正しい使い方はHTTP ACCEPT header

のようなAccept: application/jsonまたは

Accept: application/xml

参照: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

于 2013-09-18T07:05:05.340 に答える