sourcecode

Spring MVC/Spring Boot를 사용하여 적절한 글로벌 오류 핸들러를 작성하는 방법

codebag 2023. 2. 11. 09:17
반응형

Spring MVC/Spring Boot를 사용하여 적절한 글로벌 오류 핸들러를 작성하는 방법

임베디드 웹 컨테이너로 Tomcat을 사용하여 Spring 4.0.4 및 Spring Boot 1.0.2를 사용하여 웹 애플리케이션을 작성하고 있으며, 모든 예외를 대행 수신하여 특정 방법으로 기록하는 글로벌 예외 처리를 구현하고 싶습니다.간단한 요구 사항은 다음과 같습니다.

  • 아직 처리되지 않은 모든 예외를 다른 곳(예를 들어 컨트롤러 예외 핸들러)에서 글로벌하게 처리합니다.메시지를 기록하고 사용자에게 사용자 지정 오류 메시지를 표시하려고 합니다.
  • Spring이나 웹 컨테이너가 직접 오류를 기록하지 않았으면 합니다.

지금까지의 솔루션은 다음과 같습니다(간단화, 로깅 및 오류 뷰로의 리다이렉트 없음).

@Controller
@RequestMapping("/errors")
public class ErrorHandler implements EmbeddedServletContainerCustomizer
{
    @Override
    public void customize(final ConfigurableEmbeddedServletContainer factory)
    {
        factory.addErrorPages(new ErrorPage("/errors/unexpected"));
        factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/errors/notfound"));
    }

    @RequestMapping("unexpected")
    @ResponseBody
    public String unexpectedError(final HttpServletRequest request)
    {
        return "Exception: " + request.getAttribute("javax.servlet.error.exception");
    }

    @RequestMapping("notfound")
    @ResponseBody
    public String notFound()
    {
        return "Error 404";
    }
}

그 결과 컨트롤러에 느려진 예외가 에 의해 올바르게 처리됩니다.unexpectedError메서드 및 404 상태 코드는notFound방법.지금까지는 괜찮았지만, 다음과 같은 문제가 있습니다.

  • Tomcat 또는 Spring(누가 원인인지 확실하지 않음)이 아직 오류 메시지를 로깅하고 있습니다.(추가 정보를 포함하여) 직접 기록하고 로그에 오류 메시지가 중복되지 않도록 하기 때문에 원하지 않습니다.이 기본 로깅을 방지하려면 어떻게 해야 합니까?
  • 예외 개체에 액세스하는 방법이 올바르지 않은 것 같습니다.요청 속성에서 if를 가져옵니다.javax.servlet.error.exception그리고 그것은 심지어 던져진 예외도 아닙니다,org.springframework.web.util.NestedServletException이 중첩된 예외를 조사해서 진짜 예외를 가져와야 해더 쉬운 방법이 있을 거라고 확신하지만 찾을 수가 없어요.

그럼 어떻게 하면 이 문제들을 해결할 수 있을까요?아니면 이 글로벌 예외 핸들러를 구현하는 방법이 완전히 잘못되어 더 나은 대안이 있을까요?

컨트롤러 어드바이스를 참조해 주세요.이러한 조작은 다음과 같습니다.

@ControllerAdvice
public class ExceptionHandlerController {

    public static final String DEFAULT_ERROR_VIEW = "error";

    @ExceptionHandler(value = {Exception.class, RuntimeException.class})
    public ModelAndView defaultErrorHandler(HttpServletRequest request, Exception e) {
            ModelAndView mav = new ModelAndView(DEFAULT_ERROR_VIEW);

        mav.addObject("datetime", new Date());
        mav.addObject("exception", e);
        mav.addObject("url", request.getRequestURL());
        return mav;
    }
}

언급URL : https://stackoverflow.com/questions/23580509/how-to-write-a-proper-global-error-handler-with-spring-mvc-spring-boot

반응형