Implementación de ResponseResult en el lanzamiento de manejo de excepciones globales (optimización del código de la capa empresarial)

En el proceso de desarrollo, además de la excepción del sistema en sí, las excepciones utilizadas en los diferentes escenarios comerciales son diferentes. Para optimizar el código, el escenario comercial solo devuelve un resultado deseado, y todos los demás resultados utilizan el lanzamiento de excepciones. De esta manera, es necesario agregar una clase de manejo de excepciones a la capa del controlador, es decir, realizar el método de procesar la excepción lanzada por la capa del controlador y devolver el ResponseResult correspondiente.

Escribir una clase de manejo de excepciones global requiere dos anotaciones muy importantes @RestControllerAdvice. @ExceptionHandler
@ControllerAdvice captura las excepciones lanzadas por la capa del controlador. Si agrega @ResponseBody, la información de retorno estará en formato JSON.
@RestControllerAdvice es equivalente a la combinación de @ControllerAdvice y @ResponseBody.
@ExceptionHandler maneja un tipo de excepción de manera uniforme, lo que reduce la tasa de repetición y la complejidad del código.
Cree una clase GlobalExceptionHandler y agregue la anotación @RestControllerAdvice para definir la clase de notificación de excepción, y luego agregue @ExceptionHandler al método definido para lograr la captura de excepciones ...
1. Primero, escriba un código que encapsule el código de estado de ResponseCode La clase de excepción global hereda RuntimeException, agregando una variable de clase de código de estado ResponseCode y pasando el código de estado a través de ella.

import com.example.result.ResponseCode;
import lombok.Data;
/**
 * 定义一个全局异常,继承RuntimeException,这样就不需要捕获可以直接抛出
 * 与Exception需要就在于这个需要捕获......
 * */
@Data
public class GlobalException extends RuntimeException{
    
    

    private ResponseCode rc;

    public GlobalException(ResponseCode rc){
    
    
        super(rc.toString());
        this.rc = rc;
    }
}

2. Escriba la clase GlobalExceptionHandler, use las dos anotaciones anteriores, reciba las excepciones del controlador y realice los resultados de excepción correspondientes

import com.example.result.ResponseCode;
import com.example.result.ResponseResult;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**ControllerAdvice
 * ResponseBody
 * */
@RestControllerAdvice
public class GlobalExceptionHandler {
    
    

    @ExceptionHandler(value = Exception.class)
    public ResponseResult<String> exceptionHandler(HttpServletRequest request, Exception e){
    
    
        if (e instanceof GlobalException){
    
    
            GlobalException ex = (GlobalException)e;
            return ResponseResult.error(ex.getRc());
        }else {
    
    
            return ResponseResult.error(ResponseCode.SERVER_ERROR);
        }
    }
}

Escrito de esta manera, el servicio de la capa empresarial solo necesita devolver el resultado correcto y deseado al controlador, y todos los demás se envían al controlador de manera anormal y luego son aceptados por la anotación @ControllerAdvice, y se determina la excepción correspondiente. de acuerdo con @ExceptionHandler y el resultado se lanza al front-end.

Supongo que te gusta

Origin blog.csdn.net/Wangdiankun/article/details/106175590
Recomendado
Clasificación