Spring: ошибка 400 с @RequestBody и JSON

#java #json #spring #spring-mvc

#java #json #spring #spring-mvc

Вопрос:

У меня есть следующие части кода. Когда я отправляю HTTP-запрос, я получаю ошибку 400, связанную с полем carCoordinates (если я ее удалю, все будет в порядке). Предполагается, что это список double .

Кроме того, когда я меняю имя carCoordinates на carcoordinates без изменения имени получателя, запрос принимается хорошо, но я не могу получить данные, поскольку getter не связан с объектом (null). Если я изменю имя получателя на getCarcoordinates, чтобы оно соответствовало полю, это больше не будет работать. Есть идеи, почему это не работает?

CarEvent.java :

 Public class CarEvent {
    @JsonProperty("carCoordinates")
    protected List carCoordinates;
    ...
    public void setCarCoordinates(Coordinate c) {
        ...
    }
   
    public List getCarCoordinates() {
        return CarCoordinates;
    }
}
  

Отправленный JSON является :

 {
  "id": [006001556, 631016236, 125899724],
  "speed": "0",
  "carCoordinates": [56.477369, 26.64477, 56.466177, 26.651258, 80.545048, 50.614582],
  "num": "5"
}
  

Запрашиваемый класс сервера является:

 @RequestMapping(method = RequestMethod.POST, value = "/car-action", produces = "application/json;charset=UTF-8")
@ResponseBody
public String CarAction(@RequestBody CarEvent requestBody, @RequestHeader HttpHeaders httpHeaders) {
  ...
}
  

Ответ №1:

Проблема, вероятно, в вашем методе установки. Ваше поле имеет тип List , но установщик принимает объект Coordinate . Основываясь на вашем запросе json, я думаю, что это должно быть:

 public void setCarCoordinates(List c) {
   this.carCoordinates = c;
}
  

Комментарии:

1. Потрясающе, теперь это работает! Я не знал, что сигнатура метода setter важна для сопоставления. Большое вам спасибо!

2. Отлично. Да, это важно, Джексон внутренне использует методы установки с отражением для установки полей.

Ответ №2:

Ваш CarEvent
имеет метод setter с неправильным аргументом.
либо создайте класс Coordinate и расширьте до List, либо обновите, как показано ниже:

 public void setCarCoordinates(List cordinates) {
    ...
}