使用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 ...
最佳答案
使用该配置,您基本上可以:
"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”之类的媒体类型,因为:
在这种情况下,您可以将defaultContentType部分保留在配置中(并可能将其设置为自定义媒体类型),然后丢弃其余部分。
无论如何,您仍然应该在映射注释的Produces部分中声明此自定义媒体类型。