Spring Boot – RestController反序列化YAML上传?

如何配置Spring Boot RestController以接受YAML上传?

以下结果为415.我可以从调试中看到,我的Spring上下文中的MappingJackson2HttpMessageConverter实例仅支持[application/json;charset=UTF-8, application/*+json;charset=UTF-8] 。 我不能成为唯一一个尝试这样做的Spring Boot用户,我很惊讶它不仅仅起作用 – 大多数事情都是在Spring Boot中完成的!

我的POM中有YAML数据格式:

   com.fasterxml.jackson.dataformat jackson-dataformat-yaml  

我的RestController有一个方法:

 @RequestMapping(method=RequestMethod.POST, value="/", consumes="application/yaml") public String upload(@RequestBody Declaration declaration) { //Do stuff } 

我的测试:

 @Test public void triggersConvergence() throws Exception { ClassPathResource fixture = new ClassPathResource("declaration.yml"); HttpHeaders requestHeaders = new HttpHeaders(); requestHeaders.add("Content-Type", "application/yaml"); requestHeaders.add("Accept", "application/json"); URI uri = new URI("http://127.0.0.1:"+port); byte[] bytes = new byte[(int)fixture.contentLength()]; fixture.getInputStream().read(bytes); RequestEntity postRequest = new RequestEntity(bytes, requestHeaders, HttpMethod.POST, uri); ResponseEntity response = rest.exchange(postRequest, String.class); assertThat(response.getStatusCode(), is(HttpStatus.OK)); assertThat(response.getBody(), is("Converged org my-lovely-org")); } 

虽然Spring中没有这个function,但使用YAMLMapper很容易添加它, YAMLMapper 2个简单的步骤:

  1. 定义支持Content-Type: application/x-yaml自己的HttpMessageConverter Content-Type: application/x-yaml

     final class YamlJackson2HttpMessageConverter extends AbstractJackson2HttpMessageConverter { YamlJackson2HttpMessageConverter() { super(new YAMLMapper(), MediaType.parseMediaType("application/x-yaml")); } } 
  2. 注册您的转换器:

     @Configuration public class YamlConfiguration extends WebMvcConfigurerAdapter { @Override public void extendMessageConverters(List> converters) { converters.add(new YamlJackson2HttpMessageConverter()); } } 

享受控制器方法消耗生成 POJO的application/x-yaml

是的,你可以这样做。

Maven依赖:

  com.fasterxml.jackson.dataformat jackson-dataformat-yaml 2.5.4  

控制器方法:

 @RequestMapping(value = "/my/endpoint", method = RequestMethod.POST, consumes = "application/x-yaml") @ResponseBody public ResponseEntity receiveYaml(@RequestBody final String yaml) { //unserialize yaml } 

使用curl的请求示例:

 curl -X POST --header "Content-Type: application/x-yaml" --header "Accept: */*" -d "invoice: 34843 date : 2001-01-23 bill-to: &id001 given : Chris family : Dumars address: lines: | 458 Walkman Dr. Suite #292 city : Royal Oak state : MI postal : 48046 ship-to: *id001 product: - sku : BL394D quantity : 4 description : Basketball price : 450.00 - sku : BL4438H quantity : 1 description : Super Hoop price : 2392.00 tax : 251.42 total: 4443.52 comments: > Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338."