HandlerExceptionResolver
(줄여서 ExceptionResolver
)를 사용한다.ExceptionResolver
적용 전WAS
로 전달되면 상태코드 500 서버 에러가 발생한다.ExceptionResolver
적용 후WAS
로 예외가 전달되기 전에 예외 해결 시도가 가능하다.✅ 이미 예외가 발생했기 때문에,
ExceptionResolver
로 예외를 해결해도 인터셉터의 postHandle()메서드는 호출되지 않는다.
package com.common.exception.resolver
import com.common.exception.enums.ExceptionEnum
import com.fasterxml.jackson.databind.ObjectMapper
import jakarta.servlet.http.HttpServletRequest
import jakarta.servlet.http.HttpServletResponse
import org.springframework.http.HttpStatus
import org.springframework.http.MediaType
import org.springframework.web.servlet.ModelAndView
import org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver
import java.nio.charset.StandardCharsets
class CommonHandlerExceptionResolver : AbstractHandlerExceptionResolver() {
override fun doResolveException(request: HttpServletRequest, response: HttpServletResponse, handler: Any?, ex: java.lang.Exception): ModelAndView? {
val exceptionClassName = ex.javaClass.getName()
val exceptionClass = ExceptionEnum.ExceptionClassName.findClassName(exceptionClassName)
if (exceptionClass != null) {
response.status = exceptionClass.httpStatus
} else {
response.status = HttpStatus.INTERNAL_SERVER_ERROR.value()
}
response.contentType = MediaType.APPLICATION_JSON.type
response.characterEncoding = StandardCharsets.UTF_8.name()
val objectMapper = ObjectMapper()
try {
response.writer.write(objectMapper.writeValueAsString(ex.message))
response.writer.flush()
} catch (e: Exception) {
logger.error("", e)
}
return null
}
}
간단하게 예외 메세지를 반환하는
ExceptionResolver
를 구현해봤는데 맞게 한 건지 잘 모르겠다 ㅎ..~ 더 학습한 이후에 코드 수정을 해봐야겠다. 추후에@ControllerAdvice
,@ExceptionHandler
를 이용한 예외처리 방법도 기록해야겠다 ! 🧐📚
출처
API 예외 처리 (1) - MediaType, ExceptionResolver
스프링 부트 API 예외 처리 [2] HandlerExceptionResolver
ExceptionResolver를 이용한 API예외 처리
[Spring MVC] Exeption 처리방법 - AbstractHandlerExceptionResolver