Тип содержимого пусто не поддерживается - PullRequest
0 голосов
/ 13 февраля 2020

Я хочу обработать запрос POST, когда есть пустой тип контента.

  1. Когда я добавляю потребляет = MediaType.APPLICATION_JSON_VALUE и делаю запрос в почтальоне с пустым типом содержимого, я получаю следующее ошибка
{
    "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);
    }
при удалении потребляет = 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);
    }

Вот запрос POstMan enter image description here

Я хочу обработать этот сценарий и предположить, как будто content-Type = application / json отправлено

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Для обработки пустых Content-Type, как если бы application/json, необходимо настроить MappingJackson2HttpMessageConverter для поддержки application/octet-stream, а метод контроллера (т. Е. Ваш create метод) потребляет как application/octet-stream, так и application/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-stream, когда Content-Type пусто и по умолчанию конфигурация MappingJackson2HttpMessageConverter поддерживает только application / json и application / * + json. Поэтому вам нужно изменить конфигурацию и метод контроллера, как указано выше.

Следующие ссылки полезны для вас:
Javado c из MappingJackson2HttpMessageConverter
Spring загрузочные документы

0 голосов
/ 18 февраля 2020

Я наконец настроил его, и он работает. Вот правильная конфигурация для 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;
    }

Также добавьте APPLICATION_OCTET_STREAM_VALUE} в методе контроллера, который вы хотите поддерживать поток октетов.

consumes = { MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_OCTET_STREAM_VALUE
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...