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个简单的步骤:
-
定义支持
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")); } }
-
注册您的转换器:
@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."