コンテンツ タイプのさまざまなバージョンを処理するために、「Accept*」ヘッダー ( RFC 2616 ) の accept-parameters を使用しようとしています。
Accept: application/vnd.mycompany.mytype;version=2 , application/vnd.mycompany.mytype;version=1;q=0.1
問題は、Jax-RS アノテーションが Accept-parameters をサポートしていないことです...
@GET
@Produces("application/vnd.test;version=1")
public Response test1() {
return Response.ok("Version 1", "application/vnd.test").build();
}
@GET
@Produces("application/vnd.test;version=2")
public Response test2() {
return Response.ok("Version 2", "application/vnd.test").build();
}
メディア タイプの競合の例外が発生します。
Producing media type conflict. The resource methods public javax.ws.rs.core.Response test.resources.TestResource.test2() and public javax.ws.rs.core.Response test.resources.TestResource.test1() can produce the same media type
おそらく、この例外は私の JAX-RS フレームワーク (Jersey) にのみ関連していますが、accept-parameters について明示されていないJSR311が原因ではないかと心配しています。
今では、名前にバージョンを保持するコンテンツタイプを使用していますが、このソリューションはかなり醜いことがわかりました。
@GET
@Produces("application/vnd.test-v1")
public Response test() {
return Response.ok("Version 1", "application/vnd.test-v1").build();
}
accept-parameters を処理する方法について何か考えはありますか?
編集
私は十分に明確ではなかったと思います。リクエストを特定のメソッドに自動的にルーティングしたい。これらのメソッドはバージョン管理されており、返されるコンテンツ タイプの特定のバージョンに対応しています。JAX-RS の現在の実装では、accept-parameters を使用してリクエストを (対応するメソッドに) ルーティングすることができません。
greenkode はversion
、ディスパッチ メソッド内で accept-parameter を管理することを提案します (を使用@HeaderParam("Accept")
)。このソリューションは、フレームワークに組み込まれている (そして JSR 311 で説明されている) コンテンツ ネゴシエーション ロジックを書き直すことになります。
JAX-RS の accept-parameter と content-negociation ロジックの両方を使用するにはどうすればよいですか?
おそらく解決策は、別のフレームワークを使用することです(私は今のところJerseyのみを使用していました)。でもどっちか分からない。