Spring Boot - RestController反序列化YAML上传? [英] Spring Boot - RestController Deserializing YAML Uploads?

查看:208
本文介绍了Spring Boot - RestController反序列化YAML上传?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

How can I configure a Spring Boot RestController to accept YAML uploads?

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

The following results in a 415. I can see from debugging that the MappingJackson2HttpMessageConverter instances in my Spring context only support [application/json;charset=UTF-8, application/*+json;charset=UTF-8]. I can't be the only Spring Boot user trying to do this, and I'm surprised it doesn't just work - most things do in Spring Boot!

我的POM中有YAML数据格式:

I've got the YAML dataformat in my POM:

    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-yaml</artifactId>
    </dependency>

我的RestController有一个方法:

My RestController has a method thus:

@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 它只需2个简单步骤:

While this functionality is not available in Spring it's easy to add using YAMLMapper it in 2 simple steps:


  1. 定义你自己的 HttpMessageConverter 支持 内容类型:application / x-yaml

final class YamlJackson2HttpMessageConverter extends AbstractJackson2HttpMessageConverter {
    YamlJackson2HttpMessageConverter() {
        super(new YAMLMapper(), MediaType.parseMediaType("application/x-yaml"));
    }
}


  • 注册您的转换器:

  • Register your converter:

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


  • 享受控制器方法消费生成 application / x-yaml

    Enjoy controller methods consuming and producing application/x-yaml from POJOs.

    这篇关于Spring Boot - RestController反序列化YAML上传?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆