Technologieaustausch

SpringBoot: Einheitliche SpringBoot-Antwort und einheitliche Ausnahmebehandlung

2024-07-06

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

I. Einleitung

Bei der Entwicklung von Spring Boot-Anwendungen hat die Art und Weise, wie Antwortergebnisse und Ausnahmen behandelt werden, einen entscheidenden Einfluss auf die Wartbarkeit, Skalierbarkeit und Teamzusammenarbeit des Projekts. Verstreute Antwortergebnisse und Ausnahmebehandlungslogik führen häufig zu redundantem Code, der schwer zu verstehen und zu warten ist. Daher sind eine einheitliche Ergebnisrückgabe und eine einheitliche Ausnahmebehandlung eine der Schlüsselstrategien zur Verbesserung der Projektqualität.

2. Einheitliche Ergebnisrückgabe

Die Vereinheitlichung der Ergebnisrückgaben bedeutet normalerweise, ein Standardantwortformat für alle Controller-Methoden zu definieren. Dies kann durch die Erstellung einer oder mehrerer Antwortentitätsklassen erreicht werden, die gemeinsame Felder wie Statuscode, Nachricht und Daten enthalten. Nachdem die Controller-Methode die Geschäftslogik verarbeitet hat, füllt sie diese Felder und gibt sie an den Client zurück.

Schauen wir uns als Nächstes an, wie Sie in SpringBoot eine einheitliche Ergebnisrückgabe erzielen.

1. Definieren Sie ein gemeinsames Antwortobjekt

Erstellen Sie ein generisches Antwortobjekt, definieren Sie Erfolgs- und Fehlerrückgabeszenarien und stellen Sie sicher, dass das generische Rückgabeobjekt in der Schnittstelle verwendet wird.

public class ResponseResult {

    private int code;

    private String message;

    private Object data;

    public static ResponseResult success(Object data) {
        ResponseResult responseResult = new ResponseResult();
        responseResult.setData(data);
        responseResult.setCode(ResultEnum.SUCCESS.code);
        return responseResult;
    }

    public static ResponseResult error(ResultEnum resultEnum) {
        return error(resultEnum, resultEnum.message);
    }

    public static ResponseResult error(ResultEnum resultEnum, String message) {
        ResponseResult responseResult = new ResponseResult();
        responseResult.setCode(resultEnum.code);
        responseResult.setMessage(message);
        return responseResult;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

2. Definieren Sie den Statuscode für die Schnittstellenantwort

Die Definition eines gemeinsamen Satzes von Statuscodes ist einer der Kernschlüssel für eine einheitliche Ergebnisrückgabe. Dieser Ansatz verbessert nicht nur die Benutzerfreundlichkeit und Wartbarkeit der API, sondern ermöglicht dem Client auch eine effizientere Analyse und Verarbeitung von Antwortdaten. Außerdem steht API-Entwicklern ein klarer und konsistenter Standard zur Verfügung.

public enum ResultEnum {

    SUCCESS(200 ,"请求处理成功"),
    SERVICE_ERROR(500, "服务器异常,请稍后重试");

    public final Integer code;

    public final String message;

    ResultEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
}

3. Definieren Sie einheitliche Methoden zur Erfolgs- und Fehlerbehandlung

public class ResponseResult {

    private int code;

    private String message;

    private Object data;

    public static ResponseResult success(Object data) {
        ResponseResult responseResult = new ResponseResult();
        responseResult.setData(data);
        responseResult.setCode(ResultEnum.SUCCESS.code);
        return responseResult;
    }

    public static ResponseResult error(ResultEnum resultEnum) {
        return error(resultEnum, resultEnum.message);
    }

    public static ResponseResult error(ResultEnum resultEnum, String message) {
        ResponseResult responseResult = new ResponseResult();
        responseResult.setCode(resultEnum.code);
        responseResult.setMessage(message);
        return responseResult;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

4. Der Controller reagiert einheitlich auf die Ergebnisse

@GetMapping("/testResult")
 public ResponseResult test() {
     // 模拟业务逻辑
     try {
         // 假设这里有一些业务逻辑
         return ResponseResult.success("success");
     } catch (Exception e) {
         // 捕获异常并返回错误信息
         return ResponseResult.error(ResultEnum.SERVICE_ERROR);
     }
 }

3. Einheitliche Ausnahmebehandlung

Die einheitliche Ausnahmebehandlung verwendet einen globalen Ausnahmehandler, um im Controller ausgelöste Ausnahmen zu erfassen und zu verarbeiten. Dieser Ansatz vermeidet das Schreiben von doppeltem Ausnahmebehandlungscode in jeder Controller-Methode und macht außerdem die Ausnahmebehandlungslogik zentralisierter und einfacher zu verwalten.

@RestControllerAdvice
@RestControllerAdvice ist eine kombinierte Annotation, die eine Kombination aus @ControllerAdvice und @ResponseBody ist. Es wird hauptsächlich verwendet, um eine globale Konfiguration für die Controller-Ebene bereitzustellen, z. B. Ausnahmebehandlung, Datenbindung, Datenvorverarbeitung usw. Da es @ResponseBody enthält, schreiben alle über @RestControllerAdvice verarbeiteten Methoden den Rückgabewert standardmäßig in den HTTP-Antworttext und legen den entsprechenden Inhaltstyp fest.

@AusnahmeHandleR
Die Annotation @ExceptionHandler wird verwendet, um eine Methode zu markieren, die im Controller ausgelöste Ausnahmen behandelt. Wenn eine Methode im Controller eine Ausnahme auslöst, sucht Spring nach einer mit @ExceptionHandler annotierten Methode, die die Ausnahme verarbeiten kann. Wenn ja, wird die Methode aufgerufen und ihre Antwort zurückgegeben.

Beachten

当使用@ControllerAdvice时,我们需要将@ResponseBody添加到异常处理方法上。
如果我们使用@RestControllerAdvice,就不需要添加。

1. Definieren Sie Geschäftsausnahmeklassen

Mithilfe einheitlicher Ausnahmeklassen können Sie Fehler und Ausnahmen besser verwalten und die Fehlerbehandlung im gesamten System konsistenter und vorhersehbarer gestalten.

public class BusinessException extends RuntimeException{

    private final ResultEnum resultEnum;

    public BusinessException(ResultEnum resultEnum, String message) {
        super(message);
        this.resultEnum = resultEnum;
    }

    public BusinessException(ResultEnum resultEnum) {
        this(resultEnum, resultEnum.message);
    }


}

2. Globaler Ausnahmebehandler

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler({BusinessException.class})
    public ResponseResult handleBusinessException(BusinessException businessException, HttpServletRequest request) {
        // 想处理的业务
        return ResponseResult.error(ResultEnum.SERVICE_ERROR, businessException.getMessage());
    }

    /**
     * 其他异常
     * @param e
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    public ResponseResult handleOtherExceptions(Exception e) {
        // 这里可以根据不同的异常类型返回不同的状态码和消息
        // 但为了简单起见,这里只返回一个通用的错误信息
        return ResponseResult.error(ResultEnum.SERVICE_ERROR);
    }

}

3. Einheitliche Verarbeitung und Nutzung

@GetMapping("/testException1")
    public ResponseResult test1() {
        if (true) {
            // 业务场景
            throw new BusinessException(ResultEnum.SERVICE_ERROR);
        }

        return ResponseResult.success("success");
    }

Vorteile der Verwendung einer einheitlichen Ausnahmebehandlung

Code-Wiederverwendung: Vermeiden Sie das Schreiben ähnlicher Antwortergebnisse und Ausnahmebehandlungscodes an mehreren Stellen.

Leicht zu pflegen: Wenn Sie das Antwortformat oder die Ausnahmebehandlungslogik ändern müssen, müssen Sie diese nur an einer Stelle ändern.

Zusammenarbeit: Teammitglieder können einheitliche Codierungsstandards leichter verstehen und befolgen.

Skalierbarkeit: Wenn Sie neue Antworttypen oder Ausnahmebehandlungslogik hinzufügen müssen, erweitern Sie einfach die vorhandenen.