Как мне разобрать запрос JSON в объект FlightOfferSearch []? - PullRequest
0 голосов
/ 20 апреля 2020

У меня проблемы с десериализацией примера ответа JSON для FlightOfferSearch из здесь при передаче его в мой тестовый контроллер REST:

@RestController
public class MyController {

  @PostMapping("/search")
  String searchHandler(@RequestBody FlightOfferSearch[] flightOfferSearches) {
    return flightOfferSearches[0].toString();
  }
}

(минимальный пример только с Spring Boot Starter App с зависимостью "Web" и gson 2.8.5 и amadeus-java 4.1.0, добавленными в пом. xml)

Я получаю это в IntelliJ:

2020-04-20 17:05:59.392  WARN 47240 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Conflicting setter definitions for property "fixedLengthStreamingMode": java.net.HttpURLConnection#setFixedLengthStreamingMode(1 params) vs java.net.HttpURLConnection#setFixedLengthStreamingMode(1 params); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Conflicting setter definitions for property "fixedLengthStreamingMode": java.net.HttpURLConnection#setFixedLengthStreamingMode(1 params) vs java.net.HttpURLConnection#setFixedLengthStreamingMode(1 params)
 at [Source: (PushbackInputStream); line: 1, column: 1]]

Process finished with exit code -1

и это в Почтальон:

"status": 400,
"error": "Bad Request",
"message": "JSON parse error: Conflicting setter definitions for property \"fixedLengthStreamingMode\": java.net.HttpURLConnection#setFixedLengthStreamingMode(1 params) vs java.net.HttpURLConnection#setFixedLengthStreamingMode(1 params); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Conflicting setter definitions for property \"fixedLengthStreamingMode\": java.net.HttpURLConnection#setFixedLengthStreamingMode(1 params) vs java.net.HttpURLConnection#setFixedLengthStreamingMode(1 params)\n at [Source: (PushbackInputStream); line: 1, column: 1]"

Все комментарии приветствуются, спасибо!

1 Ответ

1 голос
/ 20 апреля 2020

Возможно, вы не создали сеттеры для некоторых полей для вашего класса параметров, но проблема кроется глубже - ваш способ обработки этого неверен. @RestController Spring преобразует входящую полезную нагрузку из JSON в параметр объекта метода контроллера по умолчанию и преобразует возвращаемый объект в JSON.

Вам не нужно включать какие-либо дополнительные зависимости, кроме spring-boot-starter-web, который включает маппер Джексона JSON по умолчанию.

Но даже если вместо этого вы используете gson, Spring все равно будет работать именно так, только вместо этого будет использоваться gson.

Все, что вам нужно сделать, - это создать класс, который правильно представляет ваш входящий json, и использовать этот класс в качестве параметра, он имеет иметь пустой конструктор, установщики, если вы используете этот объект в качестве тела запроса, и получатели, если вы используете этот объект в качестве тела ответа.

UPD: Если вы не являетесь владельцем объекта вы используете в качестве параметра метода контроллера - я все равно рекомендую создавать пользовательские POJO, используя неинкапсулированную стороннюю библиотеку, которая, по крайней мере, считается запахом, нарушает инкапсуляцию и создает тесную связь со сторонней библиотекой.

...