Запрос, отправленный клиентом, был синтаксически неверным ().+Spring , RESTClient

Я работаю с Spring MVC, используя объекты JSON. пока я пытаюсь отправить объект JSON из RESTClient, я получаю

Статус HTTP 400 — запрос, отправленный клиентом, был синтаксически неверным ().

это мой контроллер

ObjectMapper mapper=new ObjectMapper();
@RequestMapping(value = "/addTask", method = RequestMethod.GET)
       public ModelAndView addTask(@RequestParam("json") String json) throws JsonParseException, JsonMappingException, IOException 
       {
          System.out.println("Json object from REST : "+json);
          Task task=(Task) mapper.readValue(json, Task);
          service.addService(task);
          return new ModelAndView("Result");
       }

URL моего запроса: http://localhost:8080/Prime/addTask

Мой объект Json:

{"taskName":"ничего","taskId":1234,"taskDesc":"ничего не делается"}

Также я попытался указать «Content-Type: application/json» в RESTClient, но все равно получаю ту же ошибку.


person Chandrasekar    schedule 08.01.2013    source источник
comment
Я не уверен в том, как работает Spring, но если ваш метод запроса GET, не должны ли вы запрашивать URL-адрес http://localhost:8080/Prime/addTask?json=%7B%22taskName%22%3A%22nothing%22%2C%22taskId%22%3A1234%2C%22taskDesc%22%3A%22nothing%20doing%22%7D с параметром json, отправленным в строке запроса?   -  person Tanzeel Kazi    schedule 08.01.2013
comment
Я также попытался добавить строку json для запроса URL-адреса, но все равно выдает ту же ошибку.   -  person Chandrasekar    schedule 08.01.2013
comment
Вы можете использовать такой инструмент, как Fiddler (fiddler2.com/fiddler2/version.asp) для проверки запроса. Также опубликуйте его в вопросе, чтобы другие могли его посмотреть.   -  person Tanzeel Kazi    schedule 08.01.2013


Ответы (3)


Попробуй это

Сдача

@RequestParam("json") String json

To

 @RequestBody Task task

Если вас не интересует метод POST, вы можете попробовать это

измените метод контроллера с

@RequestMapping(value = "/addTask", method = RequestMethod.GET)
   public ModelAndView addTask(@RequestParam("json") String json)

to

@RequestMapping(value = "/addTask/{taskName}/{taskId}/{taskDesc}", method = RequestMethod.GET)
   public ModelAndView addTask(@RequestParam("taskName") String taskName,
@RequestParam("taskId") String taskId,@RequestParam("taskDesc") String taskDesc)

и измените свой URL на

http://localhost:8080/Prime/addTask/mytask/233/testDesc
person Kris    schedule 08.01.2013
comment
Спасибо за ваш ответ. Я пробовал, но бесполезно. Также @RequestBody предназначен для метода POST. Я использую метод GET - person Chandrasekar; 08.01.2013
comment
@Chandrasekar Я не думаю, что вы можете отправить объект в методе получения - person Kris; 08.01.2013

Недавно я столкнулся с аналогичной ситуацией, используя строку JSON в теле запроса и используя очень похожую настройку Spring, как у вас. В моем случае я не указывал параметр String и не десериализовал его самостоятельно, я позволял Spring сделать это:

   @RequestMapping(value = "/myService/{id}", method = RequestMethod.POST)
   @ResponseBody
   public void myService(@PathVariable(value = "id") Long id, @RequestBody MyJsonValueObject request) {
   ..
   }

Я получал ответ об ошибке HTTP 400 «Запрос, отправленный клиентом, был синтаксически неправильным». Пока я не понял, что в @RequestBody MyJsonValueObject не было конструктора по умолчанию, поэтому возникли проблемы с его десериализацией. Однако эта проблема представлена ​​таким образом.

Поэтому, если вы используете POST и объекты и получаете подобные ошибки, убедитесь, что у вас есть конструктор по умолчанию! Добавьте немного JUnit, чтобы убедиться, что вы можете десериализовать этот объект.

Примечание. Я не говорю, что это единственная причина появления этой ошибки. В исходном случае использовалась только строка (у которой есть конструктор по умолчанию!), так что все немного по-другому. Но в обоих случаях кажется, что URI запроса был сопоставлен с правильным методом, и что-то пошло не так при попытке извлечь параметры из HTTP-запроса.

person Ben Iggulden    schedule 02.10.2013
comment
Так было в моем случае. Спасибо. - person korro; 17.12.2013
comment
Тоже спас мой случай. Спасибо!! - person Jonas Geiregat; 10.04.2014
comment
Почему у нас должен быть конструктор по умолчанию с POST? - person Xelian; 18.12.2014

Моя проблема была связана с неправильным отображением объекта @RequestBody.

Тело моего запроса выглядит так

{data: ["1","2","3"]}

У меня был следующий код в моем контроллере

@RequestMapping(value = "/mentee", method = RequestMethod.POST)
public @ResponseBody boolean updateData(@RequestBody List<Integer> objDTO, HttpSession session) {
        ...
    }

Это дает мне HTTP 400, потому что Spring не знает, как связать мои данные Json со списком.

Я изменил объект RequestBody на следующий

@RequestMapping(value = "/mentee", method = RequestMethod.POST)
public @ResponseBody boolean updateData(@RequestBody ObjectiveDto objDTO, HttpSession session) {
        ...
    }

и определил ObjectiveDto следующим образом

@ToString
public class ObjectiveDto {

    @Getter @Setter
    private List<Integer> data;

}

Это устранило ошибку HTTP 400.

person Anthony Nguyen    schedule 24.02.2015