본문 바로가기
Spring Webflux

[Spring Webflux] In a WebFlux application, form data is accessed via ServerWebExchange.getFormData() 해결 방법

by 노력남자 2021. 10. 15.
반응형

에러

 

In a WebFlux application, form data is accessed via ServerWebExchange.getFormData().

 

에러 원인

 

Content-Type이 application/x-www-form-urlencoded 로 요청이 왔는데 @RequestBody를 사용했을 때 발생

 

해결 방법

 

1. 에러에서 알려준 방법대로 ServerWebExchange.getFormData()를 사용한다.

 

// 요청온 form data를 Student로 변경하는 걸 예시
@PostMapping("formData")
fun saveFormData(exchange: ServerWebExchange) = exchange.formData
    .map {
        m -> m.entries
            .associate { it.key to it.value[0] }
            .let { jacksonObjectMapper().convertValue<Student>(it) }
    }

 

2. 받고 싶은 DTO를 인자로 명시한다.

 

@PostMapping("formData")
fun saveFormData2(student: Student) = {}

 

테스트 해보니 Map<String, String>이나 다른 Collection 타입으로 받을 수 없었습니다.

 

이유는 정확히 모르겠지만 ServerWebExchange.formData 값이 Mono<MultiValueMap<String, String>> 이여서 그런 게 아닌가 싶은데 정확히 공부를 한 뒤 다시 자세히 업데이트하겠습니다.

 

추가 지식

 

webflux에선 특정 Content-Type만 받고 싶은 경우 consumes에 명시해주면 된다.

 

@PostMapping("formData", consumes = [MediaType.APPLICATION_FORM_URLENCODED_VALUE])
fun saveFormData3(student: Student) = {}
반응형

댓글