반응형
    
    
    
  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
반응형
    
    
    
  'sourcecode' 카테고리의 다른 글
| 어떻게 하면 spring boot 어플리케이션에서 letsencrypt SSL 증명서를 설정하고 사용할 수 있습니까? (0) | 2023.02.11 | 
|---|---|
| Avro 스키마에 옵션 필드를 포함할 수 있습니까(즉, 필드가 .json 파일에 전혀 표시되지 않음). (0) | 2023.02.11 | 
| 오늘 연락처 양식 7의 날짜 보기 (0) | 2023.02.11 | 
| Angular.js ng-복수의 tr에 걸쳐 반복 (0) | 2023.02.11 | 
| 테두리 반지름을 1개의 코너에만 사용하는 방법(리액티브) (0) | 2023.02.11 |