0

XML および JSON 応答と互換性のある REST サービスを作成しようとしています。両方の URI が似ています。受け入れヘッダーに基づいて応答を提供する必要があります。

これは単一の URI で可能ですか? 可能であれば、@Produces を設定するにはどうすればよいですか?

4

2 に答える 2

1

の 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 ヘッダーに従って自動的に選択されます。

于 2013-09-10T07:01:25.307 に答える
0

@Produces({"アプリケーション/xml", "アプリケーション/json"})

JAX-RS 実装の場合 ...

私はずっと前にそれを使用しましたが、カスタマイズされた MediaConfig をアプリケーションに追加する必要があることを覚えています。しかし、それは間違いなくJEE6/7用に組み込まれています。

そして、その時、リクエストURIのファイル拡張子を尊重するようにカスタマイズしました...おそらくヘッダーは常に機能していました。

編集:検索したところ、おそらくMediaConfigと呼ばれていませんでした。見つけた/覚えていて、まだ必要な場合は戻ってきます。

于 2013-09-10T06:59:48.297 に答える