Compartir tecnología

SpringBoot: respuesta unificada de SpringBoot y manejo unificado de excepciones

2024-07-06

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

I. Introducción

Al desarrollar aplicaciones Spring Boot, la forma en que se manejan los resultados de la respuesta y las excepciones tiene un impacto crucial en la mantenibilidad, la escalabilidad y la colaboración en equipo del proyecto. Los resultados de respuesta dispersa y la lógica de manejo de excepciones a menudo conducen a código redundante que es difícil de entender y mantener. Por lo tanto, la devolución de resultados unificada y el manejo unificado de excepciones son una de las estrategias clave para mejorar la calidad del proyecto.

2. Devolución de resultados unificada

Unificar los resultados de resultados generalmente significa definir un formato de respuesta estándar para todos los métodos del controlador. Esto se puede lograr creando una o más clases de entidad de respuesta que contengan campos comunes como código de estado, mensaje y datos. Una vez que el método del controlador haya procesado la lógica empresarial, completará estos campos y los devolverá al cliente.

A continuación, echemos un vistazo a cómo lograr un retorno de resultados unificado en SpringBoot.

1. Definir un objeto de respuesta común.

Cree un objeto de respuesta genérico, defina escenarios de devolución de éxito y fracaso y asegúrese de que el objeto de devolución genérico se utilice en la interfaz.

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. Definir el código de estado de respuesta de la interfaz

Definir un conjunto común de códigos de estado es una de las claves principales para obtener resultados unificados. Este enfoque no solo mejora la usabilidad y el mantenimiento de la API, sino que también permite al cliente analizar y procesar los datos de respuesta de manera más eficiente. También proporciona a los desarrolladores de API un estándar claro y consistente a seguir.

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. Definir métodos unificados de manejo de éxitos y fracasos.

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. El controlador responde uniformemente a los resultados

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

3. Manejo unificado de excepciones

El manejo unificado de excepciones utiliza un controlador de excepciones global para capturar y manejar las excepciones lanzadas en el controlador. Este enfoque evita escribir código de manejo de excepciones duplicado en cada método del controlador y también hace que la lógica de manejo de excepciones sea más centralizada y más fácil de administrar.

@RestControllerAdvice
@RestControllerAdvice es una anotación combinada, que es una combinación de @ControllerAdvice y @ResponseBody. Se utiliza principalmente para proporcionar configuración global para la capa del controlador, como manejo de excepciones, enlace de datos, preprocesamiento de datos, etc. Dado que contiene @ResponseBody, todos los métodos procesados ​​por @RestControllerAdvice escribirán el valor de retorno en el cuerpo de la respuesta HTTP de forma predeterminada y establecerán el tipo de contenido apropiado.

@ManejadorDeExcepcióna
La anotación @ExceptionHandler se utiliza para marcar un método que maneja las excepciones lanzadas en el controlador. Cuando un método en el controlador genera una excepción, Spring buscará un método anotado @ExceptionHandler que pueda manejar la excepción. Si es así, se llama al método y se devuelve su respuesta.

Aviso

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

1. Definir clases de excepción empresarial.

Las clases de excepciones unificadas pueden ayudarle a gestionar mejor los errores y las excepciones, haciendo que el manejo de errores en todo el sistema sea más consistente y predecible.

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. Manejador de excepciones globales

@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. Procesamiento y uso unificados

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

        return ResponseResult.success("success");
    }

Beneficios de utilizar el manejo unificado de excepciones

reutilización de código: Evite escribir resultados de respuesta similares y códigos de manejo de excepciones en varios lugares.

Facil de mantener: Cuando es necesario modificar el formato de respuesta o la lógica de manejo de excepciones, solo es necesario modificarlo en un lugar.

Trabajo en equipo: Los miembros del equipo pueden comprender y seguir más fácilmente estándares de codificación unificados.

Escalabilidad: Si necesita agregar nuevos tipos de respuesta o lógica de manejo de excepciones, simplemente amplíe los existentes.