【问题标题】:How to configure custom MediaType in Spring MVC?如何在 Spring MVC 中配置自定义 MediaType?
【发布时间】:2015-01-26 22:03:40
【问题描述】:

使用 Spring MVC,我的控制器已经适用于 JSON 和 XML 媒体格式。 在内容协商配置中,我想只依赖 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);
    }
}

我的控制器:

@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...

【问题讨论】:

    标签: xml json spring spring-mvc content-negotiation


    【解决方案1】:

    使用该配置,您基本上:

    • 使用参数或路径扩展忽略内容协商
    • 已注册“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 注释的“produces”部分添加“myXml” - 您的控制器方法应该将其声明为可以生成的媒体类型,否则它将再次抛出 406。

    我的建议

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

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

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

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

    【讨论】:

    猜你喜欢
    • 2013-09-29
    • 1970-01-01
    • 2018-12-11
    • 2014-12-18
    • 2014-12-22
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 2019-03-01
    相关资源
    最近更新 更多