훈훈훈

Spring :: @RequestBody with Multiple Object arguments 오류 정리 본문

Spring Framework/개념

Spring :: @RequestBody with Multiple Object arguments 오류 정리

훈훈훈 2020. 10. 11. 01:40

-  문제 발생한 코드

    >  예제코드는 Kotlin으로 작성되었습니다.

@PostMapping("/testController")    
fun testController(
    @RequestBody testDTO1: TestDTO1,
    @RequestBody testDTO2: TestDTO2
): ResponseEntity<Void> {
    return ResponseEntity(HttpStatus.OK)
}

PostMapping 할 때 두개 이상 @RequestBody를 받는 경우 JSON parse error 발생

 

 

-  원인

request 할 때 Input Stream 은 한번만 실행이 된다.

따라서 두번째 인자를 받을땐 Input Stream 이 close 상태이기 때문에 에러가 발생

 

즉, RequestBody annotation은 Single Object만 바인딩 가능

 

해당 이슈 관련해서는 Spring Project github에서도 언급됨

github.com/spring-projects/spring-framework/pull/24533 

github.com/spring-projects/spring-framework/issues/24894

 

 

-  해결 방법

1. function 분리

@PostMapping("/test1Controller")    
fun test1Controller(
    @RequestBody testDTO1: TestDTO1
): ResponseEntity<Void> {
    return ResponseEntity(HttpStatus.OK)
}
@PostMapping("/test2Controller")    
fun test2Controller(
    @RequestBody testDTO2: TestDTO2
): ResponseEntity<Void> {
    return ResponseEntity(HttpStatus.OK)
}

 

2. testDTO1, testDTO2를 wrapping한 DTO 생성 후, 해당 DTO 인자로 받음

@PostMapping("/testController")    
fun testController(
    @RequestBody newTestDTO: NewTestDTO
): ResponseEntity<Void> {
    return ResponseEntity(HttpStatus.OK)
}

 

Comments