반응형

문제

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
반응형

+ Recent posts