将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);
}
}
答案 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);
}