복붙노트

[SPRING] 클라이언트가 보낸 요청은 구문 적으로 올바르지 않습니다 (). + Spring, RESTClient

SPRING

클라이언트가 보낸 요청은 구문 적으로 올바르지 않습니다 (). + Spring, RESTClient

Spring MVC와 JSON 객체를 함께 사용하고 있습니다. RESTClient에서 JSON Object를 보내려고하는 중,

이게 내 컨트롤러 야.

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 개체 :

또한 "Content-Type : application / json"을 RESTClient에 지정하려고 시도했지만 여전히 동일한 오류가 발생합니다.

해결법

  1. ==============================

    1.이 시도

    이 시도

    변화

    @RequestParam("json") String json
    

     @RequestBody Task task
    

    POST 방법에 관심이 없다면이 방법을 시도해 볼 수 있습니다.

    컨트롤러 방법 변경

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

    @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
    
  2. ==============================

    2.최근에 요청 본문에 JSON 문자열을 사용하여 비슷한 상황이 발생하여 매우 유사한 스프링 설정을 사용하고 있습니다. 제 경우에는 String 매개 변수를 지정하지 않고 직접 deserialize하지 않았습니다. Spring에서 그렇게하도록 내버려 두었습니다.

    최근에 요청 본문에 JSON 문자열을 사용하여 비슷한 상황이 발생하여 매우 유사한 스프링 설정을 사용하고 있습니다. 제 경우에는 String 매개 변수를 지정하지 않고 직접 deserialize하지 않았습니다. 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을 추가하여 해당 객체를 deserialize 할 수 있도록하십시오.

    참고 :이 오류가 발생하는 유일한 이유는 아닙니다. 원래의 경우에는 String 만 사용되었으므로 (기본 생성자가 있습니다!) 조금 다릅니다. 그러나 두 경우 모두 요청 URI가 올바른 방법으로 매핑 된 것처럼 보이며 HTTP 요청에서 매개 변수를 추출하려고 잘못한 것 같습니다.

  3. ==============================

    3.내 문제는 @RequestBody 객체의 잘못된 매핑 때문이었습니다.

    내 문제는 @RequestBody 객체의 잘못된 매핑 때문이었습니다.

    내 요청 본문은 다음과 같습니다.

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

    컨트롤러에 다음 코드가 있습니다.

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

    Spring은 내 Json 데이터를 List에 바인딩하는 방법을 모르기 때문에 HTTP 400을 제공합니다.

    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 오류가 해결되었습니다.

  4. from https://stackoverflow.com/questions/14208682/the-request-sent-by-the-client-was-syntactically-incorrect-spring-restclie by cc-by-sa and MIT license