Spring REST视图解析 - 不支持的内容类型

时间:2013-10-16 20:18:11

标签: java xml json spring rest

XML对象Foo发布到/foo.xml时,我无法启动路径扩展视图分辨率,但会收到错误

  

不支持的内容类型:text / plain

这是未发布任何Content-Type标头的结果。但是favorPathExtention应该消除这种需要。知道为什么不这样做吗?


控制器

@RequestMapping(value="/foo.xml", method=ADD, produces="application/xml")
@ResponseStatus(HttpStatus.OK)
public @ResponseBody Foo add(@RequestBody Foo foo)  {
    return foo;
}

配置

@Configuration
@ComponentScan(basePackages="my.pkg.controller")
public class RestWebConfig extends WebMvcConfigurationSupport {

    @Override
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new MarshallingHttpMessageConverter(...));
        converters.add(new MappingJackson2HttpMessageConverter());
    }

    @Override
    protected void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.favorPathExtension(true)
            .ignoreAcceptHeader(true)
            .useJaf(false)
            .mediaType("json", MediaType.APPLICATION_JSON)
            .mediaType("xml", MediaType.APPLICATION_XML);
    }
}

2 个答案:

答案 0 :(得分:1)

我认为你误解了内容谈判的目的。

内容协商是指如何生成响应,而不是如何解析请求。

你得到了

  

不支持的内容类型:text / plain

因为,对于@RequestBody,没有已注册的HttpMessageConverter实例可以读取application/octet-stream的默认请求内容类型(或者您的客户端可能使用text/plain)。这一切都发生在RequestResponseBodyMethodProcessor中,它处理为@RequestBody注释的参数生成参数。

如果您要在请求正文中发送XML或JSON,请设置Content-Type


对于内容协商,使用您的配置和请求,DispatcherServlet将尝试生成内容类型为application/xml的响应。由于@ResponseBody,您需要HttpMessageConverter能够生成此类内容。你的MarshallingHttpMessageConverter应该足够了。如果不是,你可以自己编写。

答案 1 :(得分:0)

我通过将text/plain作为支持的媒体类型添加到邮件转换器来解决了这个问题,例如

@Override
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
    List<MediaType> jsonTypes = new ArrayList<>(jsonConverter.getSupportedMediaTypes());
    jsonTypes.add(MediaType.TEXT_PLAIN);
    jsonConverter.setSupportedMediaTypes(jsonTypes);
    converters.add(jsonConverter);
}