10

ここにJerseyサービスがあります:

@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Response service(@QueryParam("format") String format) {

  if (format.equals("json")) {...}

  return response;

}

URLパラメータ「フォーマット」に応じて生成XMLまたは応答したい。JSON

私の応答インスタンスはによって形成されていますjaxb2

次のコードを使用して、Java クライアント/機能テストを行っている場合、応答が返されるxml可能性があることはわかっています。json

String content = service.path("").queryParam("myparam", "myvalue").accept(MediaType.APPLICATION_XML).get(String.class);

また

String content = service.path("").queryParam("myparam", "myvalue").accept(MediaType.APPLICATION_JSON).get(String.class);

しかし、url パラメータに応じてそれを行う必要があります。

4

4 に答える 4

13

これは、あなたが望むことを行うための適切な方法ではありません。出力形式を決定するためにクエリ パラメータを使用しないでください。リソース メソッドが XML と JSON の両方を生成することを宣言しました。標準に準拠した方法は、クライアントが消費できるメディア タイプを宣言する適切な HTTP "Accept" ヘッダーを送信できるようにすることです。クライアントが "Accept: application/json" を送信する場合、JAX-RS 実装はメソッドの応答を JSON としてフォーマットすることを選択する必要があります。クライアントが "Accept: application/xml" を送信する場合は、応答を XML として自動的にフォーマットする必要があります。クライアントがどちらかを受け入れることができると示した場合、JAX-RS 実装はどちらかを自由に選択できるので、気にする必要はありません。クライアントがどちらも受け入れられないことを示している場合は、

于 2014-02-13T23:23:15.443 に答える
1

これが完全な例です。上記の答えは正しいです。私も上記のアプローチを使用していますが、リストの操作中に問題に直面しています。エンティティを次のように設定します。

public Response getCoursesJSONOrXML(@QueryParam("type") String type){
    //Here we get list
    List<Course> entity= courseService.getAllCourses();
    Response response = Response
            .ok(entity, "xml".equals(type) ? MediaType.APPLICATION_XML : MediaType.APPLICATION_JSON)
            .build();
    return response;
}

その後、私はこの例外に直面しています:

MessageBodyWriter not found for media type=application/json, type=class java.util.Arrays$ArrayList, genericType=class java.util.Arrays$ArrayList

ジャージのドキュメントを読んだ後、コース リストにGenericEntityを使用する必要があるという解決策を見つけました。例はこちら

@GET
@Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
public Response getCoursesJSONOrXML(@QueryParam("type") String type){
    //Here we get list
    List<Course> list = courseService.getAllCourses();
    GenericEntity<List<Course>> entity = new GenericEntity<List<Course>>(list) {};
    Response response = Response
            .ok(entity, "xml".equals(type) ? MediaType.APPLICATION_XML : MediaType.APPLICATION_JSON)
            .build();
    return response;
}
于 2016-01-31T09:43:55.000 に答える