如何配置Spring Boot RestController接受YAML上传?
以下结果为415。通过调试,我可以看到MappingJackson2HttpMessageConverterSpring上下文中的实例仅支持[application/json;charset=UTF-8, application/*+json;charset=UTF-8]。我不能成为唯一尝试执行此操作的Spring Boot用户,但我感到惊讶的是它 不仅有效 -大多数操作都在Spring Boot中完成!
MappingJackson2HttpMessageConverter
[application/json;charset=UTF-8, application/*+json;charset=UTF-8]
我的POM中有YAML数据格式:
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-yaml</artifactId> </dependency>
我的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<byte[]> postRequest = new RequestEntity<byte[]>(bytes, requestHeaders, HttpMethod.POST, uri); ResponseEntity<String> response = rest.exchange(postRequest, String.class); assertThat(response.getStatusCode(), is(HttpStatus.OK)); assertThat(response.getBody(), is("Converged org my-lovely-org")); }
虽然此功能在Spring中不可用,但只需YAMLMapper两个简单的步骤即可轻松添加它:
YAMLMapper
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<HttpMessageConverter<?>> converters) { converters.add(new YamlJackson2HttpMessageConverter()); } }
享受从POJO 消费 和 生产的 控制器方法application/x-yaml。
application/x-yaml