SpringBoot 글로벌 예외 구성

3885 단어
일상적인 웹 개발에서 이상이 발생하면 종종 통일된 이상 처리를 통해 클라이언트가 우호적인 알림을 받을 수 있도록 해야 한다.

1. 기본 이상 메커니즘


기본 예외 처리(SpringBoot은 기본적으로 웹 브라우저에 접근하는 오류 페이지 응답과 인터페이스 테스트 도구 등에 대한 매개 변수 응답 두 가지 메커니즘을 제공합니다.
원리: SpringBoot은 기본적으로 프로그램 오류의 결과 매핑 경로/error를 제공합니다.이/error 요청은 BasicErrorController에서 처리됩니다. 그 내부는 요청 헤더에 있는 Accept의 내용이 text/html인지 여부를 판단하여 요청이 클라이언트 브라우저(브라우저는 일반적으로 요청 헤더 내용을 자동으로 전송합니다. Accept:text/html)인지 클라이언트 인터페이스의 호출인지 구분하여 페이지 보기로 돌아갈지 JSON 메시지 내용으로 돌아갈지 결정합니다.

2. 사용자 정의 json 형식 이상 응답


@ControllerAdvice/@RestControllerAdvice 및 @ExceptionHandler를 통해 전역 이상 사용자 정의 응답 클래스 주석 달기
  • 우선 응답 상태 코드 매거류를 정의합니다
  • public enum ResultCode {
        SUCCESS(200),// 
        FAIL(400),// 
        UNAUTHORIZED(401),// ( )
        NOT_FOUND(404),// 
        INTERNAL_SERVER_ERROR(500);// 
        
        private final int code;
        
        ResultCode(int code) {
            this.code = code;
        }
    
        public int code() {
            return code;
        }
    }
  • 응답 클래스를 정의합니다
  • public class Result {
    
        /**
         *  
         */
        private int code;
    
        /**
         *    / 
         */
        private boolean success;
    
        /**
         *  
         */
        private String message;
    
        /**
         *  
         */
        @JsonInclude(JsonInclude.Include.NON_NULL)
        private Object data;
    
        public Result setCode(ResultCode resultCode) {
            this.code = resultCode.code();
            return this;
        }
    
        public int getCode() {
            return code;
        }
    
        public boolean isSuccess() {
            return success;
        }
    
        public Result setSuccess(boolean success) {
            this.success = success;
            return this;
        }
    
        public String getMessage() {
            return message;
        }
    
        public Result setMessage(String message) {
            this.message = message;
            return this;
        }
    
        public Object getData() {
            return data;
        }
    
        public Result setData(Object data) {
            this.data = data;
            return this;
        }
    }
  • 응답 결과를 봉인하여 미리 처리합니다
  • public class ResultGenerator {
    
        private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS";
    
        public static Result genSuccessResult() {
            return new Result()
                    .setCode(ResultCode.SUCCESS)
                    .setSuccess(true)
                    .setMessage(DEFAULT_SUCCESS_MESSAGE);
        }
    
        public static Result genSuccessResult(Object data) {
            return new Result()
                    .setCode(ResultCode.SUCCESS)
                    .setSuccess(true)
                    .setMessage(DEFAULT_SUCCESS_MESSAGE)
                    .setData(data);
        }
    
        public static Result genFailResult(String message) {
            return new Result()
                    .setCode(ResultCode.FAIL)
                    .setSuccess(false)
                    .setMessage(message);
        }
    }
  • 이상 처리류
  • @RestControllerAdvice
    public class ExceptionControllerAdvice {
    
        @ExceptionHandler(Exception.class)
        public Result jsonErrorHandler(HttpServletRequest req, Exception e){
            return ResultGenerator.genFailResult(e.getMessage());
        }
    }

    3. 사용자 정의 이상 처리 페이지

  • 템플릿에서 새 오류가 발생했습니다.html 페이지
  • 잘못된 페이지 예외 처리로 ModelandView 로 돌아갑니다
  •     @ExceptionHandler(Exception.class)
        public Object handleException(Exception e){
                ModelAndView modelAndView = new ModelAndView();
                modelAndView.addObject("msg", e.getMessage());
                modelAndView.addObject("url", req.getRequestURL());
                modelAndView.addObject("stackTrace", e.getStackTrace());
                modelAndView.setViewName("error");
                return modelAndView;
        }

    다음으로 전송:https://www.cnblogs.com/XtsLife/p/11383594.html

    좋은 웹페이지 즐겨찾기