7

Spring MVC を使用して、既に JSON と XML の両方のメディア形式で動作するコントローラーを用意しています。コンテンツ ネゴシエーション構成では、Accept ヘッダーのみに依存し、「myXml」などのカスタム名のメディア タイプを導入したいと考えています。

私の構成:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer
           .favorPathExtension(false)
           .favorParameter(false)
           .ignoreAcceptHeader(false)
           .useJaf(false)
           .mediaType(MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_JSON)
           .mediaType(MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_XML)
           .mediaType("myXml", MediaType.APPLICATION_XML)
           .defaultContentType(MediaType.APPLICATION_JSON);
    }
}

私のコントローラー:

@RequestMapping(value = "/manager/{id}",
        method = RequestMethod.GET,
        produces = {MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE}
)
@ResponseBody public Manager managers(@PathVariable long id){
    return repo.getManagerById(id);
}

Accept header: application/jsonJSON をapplication/xml生成し、XML を生成します。それ以外は 406 Not Acceptable を返しますmyXml

私はxmlを期待していましたが...

4

1 に答える 1

3

その構成では、基本的に次のことを行います。

  • パラメータまたはパス拡張を使用したコンテンツ ネゴシエーションを無視
  • 「json -> application/json」「xml -> application/xml」「myXml -> application/xml」を、これらのメディア タイプにネゴシエートするための可能なパス拡張子/パラメーターとして登録しました。(詳細はこちら)
  • Spring MVC に、HTTP クライアントが Accept ヘッダーを送信する"Accept: */*"か、まったく Accept ヘッダーを送信しない場合は常に、デフォルトの ContentType を「application/xml」にする必要があることを伝えました。

このようなコンテンツ ネゴシエーションを処理するつもりはなかったと思います。

(JAXB を使用する場合) または(Jackson を使用する場合) を登録し、それらを「application/xml」と「myXml」の両方のメディア タイプに登録するなど、 HttpMessageConverters (こちらを参照)をカスタマイズすることをお勧めします。Jaxb2RootElementHttpMessageConverterMappingJackson2XmlHttpMessageConverter

また、RequestMapping アノテーションの「生成」部分に「myXml」を追加することを忘れないでください。コントローラー メソッドは、生成可能なメディア タイプとして宣言する必要があります。そうしないと、再び 406 がスローされます。

私のアドバイス

次の理由から、必ず「application/vnd.foobar.v.1.0+xml」のようなメディア タイプを使用する必要があります。

  • これは http クライアントに関連するものです
  • xml Spring の HttpMessageConverters は、"application/xml" および "application/*+xml" を処理するために既に登録されています。

その場合、defaultContentType 部分を構成に保持して (そしておそらくカスタム メディア タイプに設定して)、残りを破棄することができます。

いずれにしても、マッピング アノテーションの生成セクションでこのカスタム メディア タイプを宣言する必要があります。

于 2014-11-29T21:56:24.583 に答える