XML および JSON 応答と互換性のある REST サービスを作成しようとしています。両方の URI が似ています。受け入れヘッダーに基づいて応答を提供する必要があります。
これは単一の URI で可能ですか? 可能であれば、@Produces を設定するにはどうすればよいですか?
の javadoc を読み込んでい@Produces
ます:
リソース クラスまたは {@link javax.ws.rs.ext.MessageBodyWriter} のメソッドが生成できるメディア タイプを定義します。* 指定されていない場合、コンテナーは任意の型を生成できると想定します。
これは、この注釈がサポートされるメディア タイプの数を減らすだけであることを意味します。それ以外の場合、選択は自動的に行われます。
インターフェイスMessageBodyWriter
には、さまざまなメディア タイプ用の多くの実装があります。具体的な実装は次のように選択されMessageBodyFactory
ます。
public <T> MediaType getMessageBodyWriterMediaType(Class<T> c, Type t,
Annotation[] as, List<MediaType> acceptableMediaTypes) {
for (MediaType acceptable : acceptableMediaTypes) {
for (MessageBodyWriterPair mbwp : customWriterListProviders) {
for (MediaType mt : mbwp.types) {
if (mt.isCompatible(acceptable) &&
mbwp.mbw.isWriteable(c, t, as, acceptable)) {
return MediaTypes.mostSpecific(mt, acceptable);
}
}
}
......................
ご覧のとおり、最初のプロバイダーをサポートする最初のプロバイダーacceptableMediaTypes
が選択されます。私見ですが、名前acceptableMediaTypes
は自明ですが、私は発見を続け、このメソッドを呼び出す唯一の場所を見つけました:
contentType = getMessageBodyWorkers().getMessageBodyWriterMediaType(
entity.getClass(),
entityType,
annotations,
request.getAcceptableMediaTypes());
のrequest
タイプはContainerRequest
です。
これがのコードですgetAcceptableMediaTypes()
public List<MediaType> getAcceptableMediaTypes() {
if (accept == null || headersModCount != headers.getModCount())
accept = new ArrayList<MediaType>(HttpHelper.getAccept(this));
return accept;
}
ご覧のとおり、メディア タイプのリストは次の結果で満たされていますHttpHelper.getAccept(this)
。
final String accept = request.getHeaderValue(HttpHeaders.ACCEPT);
Accept
結論: はい、ハードコードされた注釈@Produces
がこれを制限しない限り、メディアの種類は HTTP ヘッダーに従って自動的に選択されます。
@Produces({"アプリケーション/xml", "アプリケーション/json"})
JAX-RS 実装の場合 ...
私はずっと前にそれを使用しましたが、カスタマイズされた MediaConfig をアプリケーションに追加する必要があることを覚えています。しかし、それは間違いなくJEE6/7用に組み込まれています。
そして、その時、リクエストURIのファイル拡張子を尊重するようにカスタマイズしました...おそらくヘッダーは常に機能していました。
編集:検索したところ、おそらくMediaConfigと呼ばれていませんでした。見つけた/覚えていて、まだ必要な場合は戻ってきます。