0

我想在内容类型为空时处理 POST 请求。

  1. 当我添加 consumes = MediaType.APPLICATION_JSON_VALUE 并在邮递员中使用 Content-type 空白发出请求时,我收到以下错误
{
    "timestamp": 1581594986909,
    "status": 415,
    "error": "Unsupported Media Type",
    "message": "Content type '' not supported",
    "path": "/test"
}

这是代码


  @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity create(@RequestBody TestRequest testRequest) throws TestException {
        LOG.debug("Starting...");
        //code
        return createtest(testRequest);
    }
  1. 当我删除 consumes = MediaType.APPLICATION_JSON_VALUE 并使用 content-type = blank 发出请求时,我收到以下错误
{
    "timestamp": 1581595348209,
    "status": 415,
    "error": "Unsupported Media Type",
    "message": "Content type 'application/octet-stream' not supported",
    "path": "/test"
}

这是代码

@PostMapping(produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity create(@RequestBody TestRequest testRequest) throws TestException {
        LOG.debug("Starting...");
        //code
        return createtest(testRequest);
    }

这是邮递员的请求 在此处输入图像描述

我想处理这种情况并假设 content-Type= application/json 被发送

4

2 回答 2

0

我终于配置了它并且它正在工作。这是 MappingJackson2HttpMessageConverter 的正确配置


@Configuration(proxyBeanMethods = false)
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(jacksonMessageConverter());
        WebMvcConfigurer.super.configureMessageConverters(converters);
    }

    @Bean
    public MappingJackson2HttpMessageConverter jacksonMessageConverter() {
        MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();

        List<MediaType> supportedMediaTypes=new ArrayList<>();
        supportedMediaTypes.addAll(messageConverter.getSupportedMediaTypes());
        messageConverter.setSupportedMediaTypes(supportedMediaTypes);
        supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
        messageConverter.setSupportedMediaTypes(supportedMediaTypes);
        messageConverter.setPrettyPrint(true);
        return messageConverter;
    }

Aso 在要支持八位字节流的控制器方法中添加 APPLICATION_OCTET_STREAM_VALUE }。

consumes = { MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_OCTET_STREAM_VALUE
 }
于 2020-02-18T10:04:16.837 回答
0

要像处理空Content-Type一样application/json,您需要配置MappingJackson2HttpMessageConverter为支持application/octet-stream和控制器的方法(即您的create方法)同时使用application/octet-streamapplication/json

例如:

[配置]

@Configuration(proxyBeanMethods = false)
public class MyConfigurer {

    @Bean
    public HttpMessageConverters customConverters() {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(builder.build());
        List<MediaType> supportedMediaTypes = new ArrayList<>();
        supportedMediaTypes.addAll(converter.getSupportedMediaTypes());
        supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
        converter.setSupportedMediaTypes(supportedMediaTypes);
        return new HttpMessageConverters(converter);
    }

}

[控制器方法]

@PostMapping(produces = MediaType.APPLICATION_JSON_VALUE, consumes = {
            MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_OCTET_STREAM_VALUE })
public ResponseEntity create(@RequestBody TestRequest testRequest) throws TestException {
        LOG.debug("Starting...");
        //code
        return createtest(testRequest);
}

Spring 似乎假设什么Content-Type时候application/octet-streamContent-Type空,并且默认配置MappingJackson2HttpMessageConverter仅支持 application/json 和 application/*+json 。因此,您需要像上面一样修改您的配置和控制器的方法。

以下参考资料对您有帮助:Spring boot 文档
的 JavadocMappingJackson2HttpMessageConverter

于 2020-02-13T17:02:27.813 回答