Spring/SpringBoot einheitliche Ausnahmebehandlung @RestControllerAdvice (ExceptionHandleAdvice)

Im Projekt ist es für uns unmöglich, alle Ausnahmen vorherzusagen und abzufangen. Um zu vermeiden, dass unerwartete Ausnahmen an den Client geworfen werden, stellt uns Spring einen einheitlichen Ausnahmebehandlungsmechanismus @RestControllerAdvice zur Verfügung, der es uns ermöglicht, Ausnahmen zu behandeln, wenn die Logik Ausnahmen auslöst Machen Sie Ausnahmen benutzerfreundlich oder geben Sie die zurückgegebene Datenstruktur an das Frontend an.
Anwendungsbeispiele sind wie folgt:

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

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

Wenn der obige Code im Spring-Projekt platziert wird, werden im Controller ausgelöste Ausnahmen hier zentral verarbeitet und nach dem Drucken des Protokolls wird „Systemausnahme!“ an den Benutzer zurückgegeben.
Schreiben Sie ein Controller-Beispiel, um den Unterschied zwischen vor und nach der Verwendung zu erleben:

@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);
    }
}

Dies ist ein sehr einfacher Controller, der die Zeitzeichenfolge nach der aktuellen Zeit + Anzahl zurückgibt. Wir müssen nur die Get-Anfrage verwenden, um die Anzahl an den Server zu übergeben, und dann gibt der Server die Zeitzeichenfolge nach der aktuellen Zeit + Anzahl zurück Tage.
Testen Sie den Browser:
normale Zeit
Natürlich ist auch die Verwundbarkeit dieser Schnittstelle offensichtlich. Wenn wir einen Zählwert übergeben, der kein Long-Typ ist, wird eine Ausnahme angezeigt: eine
Ausnahmeantrag
sehr unfreundliche Ausnahmefehlermeldung. Leute, die noch nie Programmieren gelernt haben, werden das denken Mit ihrem Computer stimmt etwas nicht. . Daher müssen wir benutzerfreundlicher sein und die oben beschriebene einheitliche Ausnahmebehandlungsklasse ExceptionHandleAdvice hinzufügen, um sie erneut zu starten und erneut zu versuchen:
Behandelte Ausnahme
sehr benutzerfreundlich

Diese Verwendung ist nur eine kleine Instanz von @RestControllerAdvice. Wir können dieser einheitlichen Ausnahmebehandlungsklasse weitere Logik hinzufügen, wie zum Beispiel:

@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();
    }
}

Wenn Ihr Controller Ihre benutzerdefinierte Ausnahme TermException auslöst, wird sie von der zweiten oben genannten Methode abgefangen und die Nachricht wird an den Benutzer zurückgegeben. Testen Sie es:
Zuerst wird die Ausnahme im Controller ausgelöst:

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

Nach dem Neustart des Dienstes lauten die Ergebnisse nach der Anfrage wie folgt:
Fügen Sie hier eine Bildbeschreibung ein

Supongo que te gusta

Origin blog.csdn.net/weixin_41674401/article/details/121643986
Recomendado
Clasificación