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 = 메서드인수 불균형 에러)

반응형