Spring/SpringBoot 통합 예외 처리 @RestControllerAdvice(ExceptionHandleAdvice)

프로젝트에서 모든 예외를 예측하고 잡는 것은 불가능합니다.예기치 않은 예외가 클라이언트에 발생하는 것을 방지하기 위해 Spring은 논리에서 예외가 발생할 때 예외를 처리할 수 있도록 하는 통합 예외 처리 메커니즘인 @RestControllerAdvice를 제공합니다. .친숙한 예외를 만들거나 반환된 데이터 구조를 프런트 엔드에 지정합니다.
사용예는 다음과 같습니다.

@RestControllerAdvice
public class ExceptionHandleAdvice {
    
    
    private  final Logger logger = LoggerFactory.getLogger(ExceptionHandleAdvice.class);

    @ExceptionHandler(Exception.class)
    public String exceptionHandle(Exception e){
    
    
        logger.error("系统异常:", e);
        return "系统异常!";
    }
}

위의 코드가 Spring 프로젝트에 배치되면 Controller에서 발생한 예외가 여기에서 중앙 처리되고, 로그를 인쇄한 후 "System 예외!"가 사용자에게 반환됩니다.
사용 전과 사용 후의 차이를 경험해 보려면 컨트롤러 예제를 작성하세요.

@RestController
@RequestMapping("/time")
public class TimeController {
    
    

    @GetMapping("/now")
    public LocalDateTime now(){
    
    
        return LocalDateTime.now();
    }

    /**
     * 返回当前时间+count后的时间字符串
     * 
     * @param count 未来天数
     * @return 时间字符串
     */
    @GetMapping("/oneDay")
    public LocalDateTime now(@RequestParam Long count){
    
    
        return LocalDateTime.now().plusDays(count);
    }
}

이것은 현재 시간 + 개수 이후의 시간 문자열을 반환하는 매우 간단한 컨트롤러입니다. get 요청을 사용하여 서버에 개수를 전달하면 서버는 현재 시간 + 개수 이후의 시간 문자열을 반환합니다. 날.
브라우저 테스트:
정상 시간
물론 이 인터페이스의 취약점도 명백합니다. Long 유형이 아닌 count 값을 전달하면
예외 요청
매우 불친절한 예외 오류 메시지와 같은 예외가 나타납니다. 프로그래밍을 전혀 배운 적이 없는 사람들은 이렇게 생각할 것입니다. 그 사람 컴퓨터에 문제가 생겼어요. . 따라서 우리는 좀 더 사용자 친화적이어야 하며 위에서 작성한 ExceptionHandleAdvice 통합 예외 처리 클래스를 추가하여 다시 시작하고 다시 시도해야 합니다.
처리된 예외
매우 친숙합니다 .

이 사용법은 @RestControllerAdvice의 작은 인스턴스일 뿐이며 이 통합 예외 처리 클래스에 다음과 같은 다른 논리를 추가할 수 있습니다.

@RestControllerAdvice
public class ExceptionHandleAdvice {
    
    
    private  final Logger logger = LoggerFactory.getLogger(ExceptionHandleAdvice.class);

    @ExceptionHandler(Exception.class)
    public String exceptionHandle(Exception e) {
    
    
        logger.error("系统异常:", e);
        return "系统异常!";
    }
    // 处理自定义异常
    @ExceptionHandler(TermException.class)
    public String exceptionHandle(TermException termException) {
    
    
        logger.error("自定义异常:", termException);
        return termException.getMessage();
    }

    // 处理正常请求,对时间进行格式化
    @ResponseStatus(HttpStatus.ACCEPTED) // 值为202
    public <T> String sendSuccessResponse(T data) {
    
    
        if (data instanceof LocalDateTime) {
    
    

            return "时间为" + ((LocalDateTime) data).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        }
        return data.toString();
    }
}

컨트롤러가 사용자 정의 예외 TermException을 발생시키면 위의 두 번째 방법에 의해 포착되고 메시지가 사용자에게 반환됩니다. 테스트해 보세요.
먼저 컨트롤러에서 예외를 발생시킵니다.

   @GetMapping("/oneDay")
   public LocalDateTime now(@RequestParam Long count){
    
    
       if (count < 0L){
    
    
           throw new TermException("count不能小于0!");
       }
       return LocalDateTime.now().plusDays(count);
   }

서비스를 다시 시작한 후 요청 후 결과는 다음과 같습니다.
여기에 이미지 설명을 삽입하세요.

추천

출처blog.csdn.net/weixin_41674401/article/details/121643986