RequestBodyJsonController

/**
 * {"username":"hello", "age":20}
 * content-type: application/json
 */
@Slf4j
@Controller
public class RequestBodyJsonController {

		private ObjectMapper objectMapper = new ObjectMapper();

		@PostMapping("/request-body-json-v1")
		public void requestBodyJsonV1(HttpServletRequest request, HttpServletResponse response) throws IOException {
				ServletInputStream inputStream = request.getInputStream();
				String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

				log.info("messageBody={}", messageBody);
				HelloData data = objectMapper.readValue(messageBody, HelloData.class);
				log.info("username={}, age={}", data.getUsername(), data.getAge());

				response.getWriter().write("ok");
		}

}

requestBodyJsonV2 - @RequestBody 문자 변환

/**
 * @RequestBody
 * HttpMessageConverter 사용 -> StringHttpMessageConverter 적용
 *
 * @ResponseBody
 * - 모든 메서드에 @ResponseBody 적용
 * - 메시지 바디 정보 직접 반환(view 조회X)
 * - HttpMessageConverter 사용 -> StringHttpMessageConverter 적용
 */
@ResponseBody
@PostMapping("/request-body-json-v2")
public String requestBodyJsonV2(@RequestBody String messageBody) throws IOException {
		HelloData data = objectMapper.readValue(messageBody, HelloData.class);
		log.info("username={}, age={}", data.getUsername(), data.getAge());
		return "ok";
}

requestBodyJsonV3 - @RequestBody 객체 변환

/**
 * @RequestBody 생략 불가능(@ModelAttribute 가 적용되어 버림)
 * HttpMessageConverter 사용 -> MappingJackson2HttpMessageConverter (contenttype: application/json)
 *
 */
@ResponseBody
@PostMapping("/request-body-json-v3")
public String requestBodyJsonV3(@RequestBody HelloData data) {
		log.info("username={}, age={}", data.getUsername(), data.getAge());
		return "ok";
}

@RequestBody 객체 파라미터

@RequestBody는 생략 불가능

따라서 이 경우 HelloData에 @RequestBody 를 생략하면 @ModelAttribute 가 적용되어버린다. HelloData data @ModelAttribute HelloData data 따라서 생략하면 HTTP 메시지 바디가 아니라 요청 파라미터를 처리하게 된다.

주의! HTTP 요청시에 content-type이 application/json인지 꼭! 확인해야 한다. 그래야 JSON을 처리할 수 있는 HTTP 메시지 컨버터가 실행된다