Spring RequestMapping в RestController возвращает 406

Внутри @RestController у меня есть @RequestMapping, который работает, за исключением того, что я получаю 406 в клиенте при попытке вернуть класс POJO ResponseVO

@RequestMapping(value = "path", method = RequestMethod.POST
            , produces = MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody ResponseEntity<GenericResponse> path(

...
ResponseVO responseVO = new responseVO();
return new ResponseEntity<>(responseVO, HttpStatus.OK);

Я отправляю POST с телом JSON, мои заголовки запроса:

Connection: keep-alive
Content-Type: application/json
Accept: */*
Content-Length: 58
Host: localhost:8080
User-Agent: Apache-HttpClient/4.5.6 (Java/1.8.0_151)

Заголовки ответа:

HTTP/1.1 406 Not Acceptable
Server: Apache-Coyote/1.1
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: POST, GET, PUT, OPTIONS, DELETE
Access-Control-Max-Age: 3600
Access-Control-Allow-Headers: X-Requested-With, Content-Type, Authorization, Origin, Accept, Access-Control-Request-Method, Access-Control-Request-Headers
Content-Type: text/html;charset=utf-8
Content-Language: en
Content-Length: 1067

responseVO расширяет GenericResponse?

Fima Taf 16.10.2018 07:49

Прежде всего, удалите аннотацию @ResponseBody из метода, потому что она уже включена в аннотацию @RestController. Также удалите атрибут produces из @RequestMapping и проверьте, исчезла ли проблема.

Kamil W 16.10.2018 07:52

@FimaTaf да, это так

user7294900 16.10.2018 07:56

Попробуйте изменить значение заголовка запроса Accept на application/json

a.l. 16.10.2018 07:57

@aLeX Я пробовал и тот же ответ

user7294900 16.10.2018 07:59

Можете ли вы опубликовать полный путь к URL-адресу, на который вы отправляете сообщение?

Fabulous 16.10.2018 08:05

@ Сказочно, это актуально? Я могу отлаживать его и возвращаю инструкцию

user7294900 16.10.2018 08:06

Возможно, вы пропустили начальную косую черту ..... перед словом "путь"

Fabulous 16.10.2018 08:09

@KamilW. как-то после вашего изменения я получаю код статуса 200, вы можете объяснить?

user7294900 16.10.2018 08:09

@ user7294900 Вы сделали оба моих предложения? Я предполагаю, что решение заключалось в удалении атрибута produces, и в этом случае Spring автоматически обнаружит тип содержимого ответа, но это только мои предположения. Можете ли вы отметить мой ответ как решение вашей проблемы?

Kamil W 16.10.2018 08:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
10
251
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Прежде всего, удалите аннотацию @ResponseBody из метода, потому что она уже включена в аннотацию @RestController. Также удалите атрибут produces из @RequestMapping и проверьте, исчезла ли проблема.

когда вы используете @RestController, это автоматически означает, что вы аннотируете @Controller и @ResponseBody при весенней загрузке. Таким образом, вам не нужно явно добавлять аннотацию @ResponseBody к вашему методу. Также над методом добавлена ​​аннотация @ResponseBody, а не объявление метода. Так что даже если вы правильно добавите эту аннотацию, ваш код должен работать нормально. посмотрите ниже.

@RequestMapping(value = "path", method = RequestMethod.POST, produces =MediaType.APPLICATION_JSON_VALUE)
@ResponseBody 
public ResponseEntity<GenericResponse> path(

...
    ResponseVO responseVO = new responseVO();
    return new ResponseEntity<>(responseVO, HttpStatus.OK);

Вы не установили свойство consumes в @RequestMapping.

Но вместо этого вы можете использовать @PostMapping для JSON, там все значения будут установлены по умолчанию.

просто @PostMapping("path")

Другие вопросы по теме