Spring Webflux 예외처리
WebExceptionHandler
@Component
@Order(-2) // Order(-1) 에 등록된 DefaultErrorWebExceptionHandler 보다 높은 우선순위를 부여하기 위함.
class GlobalExceptionHandler: WebExceptionHandler {
override fun handle(exchange: ServerWebExchange, ex: Throwable): Mono<Void> =
handle(ex)
.flatMap {
it.writeTo(exchange, HandlerStrategiesResponseContext(HandlerStrategies.withDefaults()))
}.flatMap {
Mono.empty<Void>()
}
fun handle(throwable: Throwable): Mono<ServerResponse> {
return when (throwable) {
is ApiException -> {
createResponse(throwable.exception)
}
else -> {
createResponse(ExceptionMessage.INTERNAL_SERVER_ERROR)
}
}
}
private fun createResponse(exception: ExceptionMessage): Mono<ServerResponse> {
// bodyValue에는 저희가 원하는 Response 형태를 넣어 줍시다.
return ServerResponse.status(exception.statusCode).bodyValue(Response(exception.message, null))
}
}
private class HandlerStrategiesResponseContext(val strategies: HandlerStrategies) : ServerResponse.Context {
override fun messageWriters(): List<HttpMessageWriter<*>> {
return this.strategies.messageWriters()
}
override fun viewResolvers(): List<ViewResolver> {
return this.strategies.viewResolvers()
}
}예외 발생 시키기
Last updated