Condivisione della tecnologia

SpringBoot: risposta unificata SpringBoot e gestione unificata delle eccezioni

2024-07-06

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

I. Introduzione

Quando si sviluppano applicazioni Spring Boot, il modo in cui vengono gestiti i risultati della risposta e le eccezioni ha un impatto cruciale sulla manutenibilità, scalabilità e collaborazione del team del progetto. I risultati di risposta dispersi e la logica di gestione delle eccezioni spesso portano a codice ridondante difficile da comprendere e mantenere. Pertanto, la restituzione unificata dei risultati e la gestione unificata delle eccezioni sono una delle strategie chiave per migliorare la qualità del progetto.

2. Restituzione dei risultati unificata

Unificare i risultati restituiti di solito significa definire un formato di risposta standard per tutti i metodi del controller. Ciò può essere ottenuto creando una o più classi di entità di risposta che contengono campi comuni come codice di stato, messaggio e dati. Dopo che il metodo del controller ha elaborato la logica aziendale, popolerà questi campi e li restituirà al client.

Successivamente, diamo un'occhiata a come ottenere un ritorno di risultati unificato in SpringBoot.

1. Definire un oggetto di risposta comune

Creare un oggetto di risposta generico, definire gli scenari di restituzione di esito positivo e negativo e assicurarsi che l'oggetto di restituzione generico venga utilizzato nell'interfaccia.

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. Definire il codice di stato della risposta dell'interfaccia

La definizione di un insieme comune di codici di stato è una delle chiavi fondamentali per ottenere un risultato unificato. Questo approccio non solo migliora l'usabilità e la manutenibilità dell'API, ma consente anche al client di analizzare ed elaborare i dati di risposta in modo più efficiente. Fornisce inoltre agli sviluppatori API uno standard chiaro e coerente da seguire.

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. Definire metodi unificati di gestione dei successi e degli insuccessi

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. Il controller risponde in modo uniforme ai risultati

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

3. Gestione unificata delle eccezioni

La gestione unificata delle eccezioni utilizza un gestore di eccezioni globale per acquisire e gestire le eccezioni generate nel controller. Questo approccio evita di scrivere codice di gestione delle eccezioni duplicato in ciascun metodo del controller e rende inoltre la logica di gestione delle eccezioni più centralizzata e più semplice da gestire.

@RestControllerAdvice
@RestControllerAdvice è un'annotazione combinata, ovvero una combinazione di @ControllerAdvice e @ResponseBody. Viene utilizzato principalmente per fornire una configurazione globale per il livello controller, come la gestione delle eccezioni, l'associazione dei dati, la preelaborazione dei dati, ecc. Poiché contiene @ResponseBody, tutti i metodi elaborati da @RestControllerAdvice scriveranno il valore restituito nel corpo della risposta HTTP per impostazione predefinita e imposteranno il Content-Type appropriato.

@GestioneEccezioneR
L'annotazione @ExceptionHandler viene utilizzata per contrassegnare un metodo che gestisce le eccezioni generate nel controller. Quando un metodo nel controller genera un'eccezione, Spring cercherà un metodo annotato @ExceptionHandler in grado di gestire l'eccezione. In tal caso, viene chiamato il metodo e viene restituita la sua risposta.

Avviso

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

1. Definire le classi di eccezioni aziendali

Le classi di eccezioni unificate possono aiutarti a gestire meglio errori ed eccezioni, rendendo la gestione degli errori in tutto il sistema più coerente e prevedibile.

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. Gestore delle eccezioni globali

@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. Elaborazione e utilizzo unificati

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

        return ResponseResult.success("success");
    }

Vantaggi derivanti dall'utilizzo della gestione unificata delle eccezioni

riutilizzo del codice: evitare di scrivere risultati di risposta simili e codici di gestione delle eccezioni in più posti.

Facile da mantenere: quando è necessario modificare il formato della risposta o la logica di gestione delle eccezioni, è sufficiente modificarli in un unico punto.

Lavoro di squadra: i membri del team possono comprendere e seguire più facilmente gli standard di codifica unificati.

Scalabilità: se è necessario aggiungere nuovi tipi di risposta o logica di gestione delle eccezioni, è sufficiente estendere quelli esistenti.