[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.이 시도
이 시도
변화
@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.최근에 요청 본문에 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.내 문제는 @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 오류가 해결되었습니다.
from https://stackoverflow.com/questions/14208682/the-request-sent-by-the-client-was-syntactically-incorrect-spring-restclie by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] ApplicationContext를로드하지 못했습니다 (주석 첨부). (0) | 2019.04.19 |
---|---|
[SPRING] Spring Security에서 어떤 종류의 소유권을 기반으로 사용자 역할 설정하기 (0) | 2019.04.18 |
[SPRING] Spring-WS 1.5를 Spring 3와 함께 사용할 수 있습니까? (0) | 2019.04.18 |
[SPRING] Hibernate 4.3.0.Final & Spring 데이터 JPA 1.4.3.RELEASE (0) | 2019.04.18 |
[SPRING] @Autowired는 구성 요소 검색이 제거 된 경우 작동하지 않습니다. (0) | 2019.04.18 |