Error
[Error] MethodArgumentTypeMismatchException(with. Postman)
Wonol
2022. 9. 29. 09:56
반응형
API 를 개발하고 PostMan 으로 확인하는 도중 아래와 같은 에러로 테스트가 되지 못 하였다.
{
"timestamp": "2022-09-28T09:23:35.655+00:00",
"status": 400,
"error": "Bad Request",
"trace": "org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to
...
"message": "Failed to convert value of type 'java.lang.String' to required type 'java.lang.Boolean';
nested exception is java.lang.IllegalArgumentException: Invalid boolean value [save]",
"path": "/todos/save"
}
1. 원인
- 개발한 API 는 save(=insert) 작업으로 Post 방식으로 통신이 필요한데, Restful API 형식으로 개발하다보니 비슷한 URI 지만 Get 방식을 호출하면서 @PathVariable 어노테이션을 통해 파라미터를 받는 도중 에러가 발생하였다.
// Todo 등록
@PostMapping("/todos/save")
public String createJsonTodo(@RequestBody @Valid TodoForm form, BindingResult bindingResult){
log.info("Post : Todo Save");
return validation(form, bindingResult);
}
// Todo 목록
@GetMapping("/todos/{orderState}")
public List<Todo> list(@PathVariable("orderState") Boolean orderState){
log.info("Get : Todos List");
return todoService.findTodos(orderState);
}
- /todos/save 를 Get 방식으로 호출하면서 orderState 를 Boolean 타입으로 받고 있는데 "save"란 String 단어가 들어가면서 Convert 에 실패를 하게 된 것이다.
2. 해결법
- 원인에서와 같이 호출방법을 Post 로 변경하여 호출하면 정상적으로 호출이 된다.
3. 번외
Failed to convert value of type 'java.lang.String' to required type 'java.lang.Boolean'; nested exception is java.lang.IllegalArgumentException: Invalid boolean value [save]
- Postman 에서 전달해주는 위 메시지를 보고 당연하게도 VO(=Dto) 가 잘못되어 파싱하는 도중에 에러가 발생하는 줄 알았다.
- 실제로는 VO는 이상이 없었고, Get / Post 호출의 URI 가 동일? 함으로써 발생한 에러였다.
- 다시 보니 에러메시지를 보아도 유추가 가능한 에러였던 것 같다.(MethodArgumentTypeMismatchException = 메서드인수 불균형 에러)
반응형