如何在Spring MVC中配置自定义MediaType?
使用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标头:application/json
生成JSON,application/xml
生成XML。其他任何内容均返回406不可接受,甚至myXml
。
我虽然期望xml …
回答:
使用该配置,您基本上可以:
- 使用参数或路径扩展忽略了内容协商
- 注册“ json-> application / json”“ xml-> application / xml”“ myXml-> application / xml”作为可能的路径扩展名/参数,以协商这些媒体类型。(在此了解更多信息)
- 告诉Spring MVC,每当HTTP客户端发送
"Accept: */*"
或根本不发送Accept标头时,默认ContentType应为“ application / xml”
我不认为您打算像这样处理内容协商。
您可能想要自定义HttpMessageConverters(请参见此处),例如注册一个Jaxb2RootElementHttpMessageConverter
(如果使用JAXB)或一个MappingJackson2XmlHttpMessageConverter
(如果使用Jackson)并使用“
application / xml”和“ myXml”媒体类型注册它们。
另外,不要忘记在RequestMapping批注的“产生”部分中添加“ myXml”-您的控制器方法应将其声明为可以产生的媒体类型,否则它将再次抛出406。
回答:
您绝对应该使用诸如“ application / vnd.foobar.v.1.0 + xml”之类的媒体类型,因为:
- 这与http客户端有关
- Spring中的xml HttpMessageConverters已被注册以处理“ application / xml”和“ application / * + xml”。
在这种情况下,您可以将defaultContentType部分保留在配置中(并可能将其设置为自定义媒体类型),然后丢弃其余部分。
无论如何,您仍应在映射注释的Produces部分中声明此自定义媒体类型。
以上是 如何在Spring MVC中配置自定义MediaType? 的全部内容, 来源链接: utcz.com/qa/434216.html