@PostMapping("{id}")
public void testMethod(@RequestBody String value, @PathVariable long id) {
System.out.println("value = " + value);
}
@RequestBody 동작 순서
- HTTP Clients 가 request body에 데이터를 담아 request 를 보낸다.
- 컨트롤러 메서드에 @RequestBody가 명시되어 있으면 해당 어노테이션이 스프링에게 request body에 담긴 데이터를 도메인 객체로 역직렬화 처리 하라고 알려준다.
- 추가적으로 자바 Map 으로도 역직렬화 처리를 해준다
@RequestBody Integer id 로 받을 수 없는 이유는 이때 MappingJackson2HttpMessageConverter 가 동작하기 때문이고, 이때 내부적으로 Cannot deserialize value of type `java.lang.Integer` from Object value (token `JsonToken.START_OBJECT`) 이러한 에러가 발생하게 됩니다.
@RequestBody String id 로하면 에러가 발생하진 않고, StringHttpMessageConverter 가 동작하게 되어 String 객체에 json 형식의 문자열이 그대로 찍히게 됩니다.
@RequestBody를 사용하면 원래 자동으로 객체와 매핑이 되는데 String 하나만 보낸다면 '{"value" : "1234"}' 처럼 JSON 형식이 Dictionary한 모습으로 파싱되어서 들어오기 때문에
해당 값을 받으려면 Map<String, String> 을 사용해야 한다.