MissingKotlinParameterException이 발생하는 이유를 알아보고 이를 ExceptionHandler로 처리하는 방법을 알아보자.
MissingKotlinParameterException 발생 원인
@RestController
class CourseController {
@PostMapping("/course")
fun saveCourse(@RequestBody course: Course): String {
return ""
}
}
data class Course(
val name: String
)
/course api에서 사용하는 Course 객체의 name 필드는 nullable이 아니다.
{
"name": null
}
.w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Instantiation of [simple type, class com.example.kotlintest.Course] value failed for JSON property name due to missing (therefore NULL) value for creator parameter name which is a non-nullable type; nested exception is com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException: Instantiation of [simple type, class com.example.kotlintest.Course] value failed for JSON property name due to missing (therefore NULL) value for creator parameter name which is a non-nullable type<EOL> at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 5, column: 1] (through reference chain: com.example.kotlintest.Course["name"])]
MissingKotlinParameterException을 ExceptionHandler으로 잡는 방법
자세히 보면 MissingKotlinParameterException을 HttpMessageNotReadableException에서 발생키기고 있다.
(Spring mvc는 HttpMessageNotReadableException, webflux는 CodecException에서 발생시킨다.)
에러를 throw 하는 곳을 찾아가보자.
AbstractJackson2HttpMessageConverter.java 파일 390번째 라인에 있다.
그냥 HttpMessageNotReadableException만 잡으면 될 거 같다.....라고 생각했지만
HttpMessageNotReadableException이 발생하는 cause는 생각보다 많았다.
그래서 HttpMessageNotReadableException로 잡고 cause 가 MissingKotlinParameterException인 경우를 처리해야 한다.
@RestControllerAdvice
class ExceptionHandler {
val log = KotlinLogging.logger {}
@ExceptionHandler(HttpMessageNotReadableException::class)
fun handleHttpMessageNotReadableException(e: HttpMessageNotReadableException) {
when (val caused = e.cause) {
is MissingKotlinParameterException -> {
log.warn(e) { "${caused.parameter.name} 필드가 누락되었습니다." }
}
else -> throw e
}
}
}
위와 같이 정의한 후 아까 위처럼 다시 name에 null을 넣어서 호출하면
name 필드가 누락되었다고 나온다.
'Spring' 카테고리의 다른 글
[Spring] properties 가져오기 (2) - 4가지 방법으로 읽어오기 (0) | 2023.02.10 |
---|---|
[Spring] properties 가져오기 (1) - 종류, 우선순위 (0) | 2023.02.10 |
[Spring] "has been compiled by a more recent version" 에러 처리 방법 (0) | 2022.12.19 |
[Spring] ReturnValueHandler 추가 방법 (kotlin ver.) (0) | 2022.12.18 |
[Spring] ArgumentResolver 추가 방법 (kotlin ver.) (0) | 2022.12.18 |
댓글