문제
kopring 프로젝트를 작성하던 중 POST method에서 body가 x-www-form-urlencoded 형태로 들어오는 요청을 처리하는 로직을 작성하고 있었다.
간단한 return을 만들고 통신 확인을 해보니 다음과 같은 오류가 발생하였다.
💣 spring boot 콘솔 에러
2024-07-31T09:44:19.505+09:00 WARN 48404 --- [gbike-tagride-api-server] [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content-Type 'application/x-www-form-urlencoded;charset=UTF-8' is not supported]
💣 postman 응답 에러
{
"timestamp": "2024-07-31T00:44:19.509+00:00",
"status": 415,
"error": "Unsupported Media Type",
"path": "/v2/vehicle/unlock"
}
그리고 내가 작성했던 controller는 아래와 같다.
@PostMapping(UNLOCK)
fun unlock(
@RequestBody unlockRequestDto: UnlockRequestDto,
): String {
return "unlock"
}
문제 해결 시도
1. 컨버터 추가
Spring MVC 설정에 FormHttpMessageConverter를 추가하여 application/x-www-form-urlencoded 타입을 처리할 수 있도록 한다.
@Configuration
class WebConfig : WebMvcConfigurer {
override fun configureMessageConverters(converters: MutableList<HttpMessageConverter<*>>) {
converters.add(FormHttpMessageConverter())
}
}
결과 : 안됨!! 동일한 오류 발생
2. PostMapping에 consume 속성을 추가하여 type을 처리할수 있도록 명시해주기
컨트롤러 메서드에 @RequestMapping 또는 @PostMapping 어노테이션에 consumes 속성을 추가하여 application/x-www-form-urlencoded 타입을 지원하도록 설정한다.
@PostMapping(UNLOCK, consumes = ["application/x-www-form-urlencoded"])
fun unlock(
@RequestBody unlockRequestDto: UnlockRequestDto,
): String {
return "unlock"
}
결과 : 안됨 !! 동일한 오류 발생
3. @RequestParam을 사용한다.
(안될거 알았다.. 애초에 넘기는게 body 였다.)
@PostMapping(UNLOCK)
fun unlock(
@RequestParam unlockRequestDto: UnlockRequestDto,
): String {
return "unlock"
}
결과 : 안됨 !! 새로운 오류 발생
💣 spring boot 콘솔 에러
2024-07-31T09:56:06.532+09:00 WARN 49097 --- [gbike-tagride-api-server] [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'unlockRequestDto' for method parameter type UnlockRequestDto is not present]
💣 postman 응답 에러
{
"timestamp": "2024-07-31T00:56:06.535+00:00",
"status": 400,
"error": "Bad Request",
"path": "/v2/vehicle/unlock"
}
google 선생님의 도움으로 이것저것 검색해 보니 다음과 같은 답을 찾아냈다.
@RequestBody는 body로 받은 JSON을 jackson을 통해 Object로 변경하는데 form은 Content-Type: application/x-www-form-urlencoded 으로 전송하기 때문에 타입이 맞이 않아 에러가 발생한다.
문제 해결
따라서 RequestBody를 제거해 주면 된다!
@PostMapping(UNLOCK)
fun unlock(unlockRequestDto: UnlockRequestDto): String
{
return "unlock"
}
결과 : 성공!
unlock
'작업로그' 카테고리의 다른 글
[소셜로그인] OAuth 인증 사용하기 - 1 : 네이버 간편 로그인 (1) | 2024.03.30 |
---|---|
[Mongodb] 용량확보를 위한 처리 (compact) (1) | 2024.02.08 |