加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml – 如何在Spring MVC中配置自定义MediaType?

发布时间:2020-12-16 22:52:45 所属栏目:百科 来源:网络整理
导读:使用 Spring MVC,我已经有了 JSON和XML媒体格式的控制器. 在内容协商配置中,我只想依赖Accept头,并引入自定义名称媒体类型,例如:“myXml” 我的配置: @Configuration@EnableWebMvcpublic class WebConfig extends WebMvcConfigurerAdapter { @Override pub
使用 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 / 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头时,默认的ContentType应为“application / xml”

我不认为你打算像这样处理内容协商.

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

另外,不要忘记在RequestMapping注释的“produce”部分添加“myXml” – 您的控制器方法应该将其声明为它可以生成的媒体类型,否则它将再次抛出406.

我的建议

你应该使用像“application / vnd.foobar.v.1.0 xml”这样的媒体类型,因为:

>这与http客户端有关
> Spring中的xml HttpMessageConverters已经注册处理“application / xml”和“application / * xml”.

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

在任何情况下,您仍应在映射注释的produce部分中声明此自定义媒体类型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读