如何在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

回到顶部