使用Spring MVC,我已经拥有适用于JSON和XML媒体格式的 Controller 。
在内容协商配置中,我只想依靠Accept header ,并引入自定义名称媒体类型,例如:“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);
    }
}

我的 Controller :
@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/json产生JSON,application/xml产生XML。其他任何内容都返回406 Not Acceptable ,甚至返回myXml

我虽然期望xml ...

最佳答案

使用该配置,您基本上可以:

  • 忽略了使用参数或路径扩展的内容协商
  • 将“json-> application/json”“xml-> application/xml”“myXml-> application/xml”注册为可能的路径扩展名/参数,以协商这些媒体类型。 (see more about this here)
  • 告诉Spring MVC,每当HTTP客户端发送"Accept: */*"或根本不发送Accept header 时,默认的ContentType应为“application/xml”

  • 我不认为您打算像这样处理内容协商。

    您可能想要自定义HttpMessageConverters(see here),例如注册Jaxb2RootElementHttpMessageConverter(如果使用JAXB)或MappingJackson2XmlHttpMessageConverter(如果使用Jackson),然后使用“application/xml”和“myXml”媒体类型注册它们。

    另外,不要忘记在RequestMapping批注的“产生”部分中添加“myXml”-您的 Controller 方法应将其声明为可以产生的媒体类型,否则它将再次抛出406。

    我的建议

    您绝对应该使用诸如“application/vnd.foobar.v.1.0 + xml”之类的媒体类型,因为:
  • 这与HTTP客户有关
  • Spring中的
  • xml HttpMessageConverters已被注册以处理“application/xml”和“application/* + xml”。

  • 在这种情况下,您可以将defaultContentType部分保留在配置中(并可能将其设置为自定义媒体类型),然后丢弃其余部分。

    无论如何,您仍然应该在映射注释的Produces部分中声明此自定义媒体类型。

    10-05 21:14
    查看更多