SpringBoot define un marco de respuesta de API Restful unificado global elegante tres

Lo hemos diseñado hasta ahora, incluida la respuesta global, y la respuesta de error anormal se devuelve de manera uniforme. Sin embargo, el contenido de error que diseñamos es relativamente vago y unificado, y también se puede refinar, lo que es más propicio para localizar errores.

Cuando necesitamos llamar a la interfaz Http, ya sea en la web o en el móvil, podemos encontrarnos con varios errores, como falta de parámetros, errores de tipo, errores del sistema, etc. Para estandarizar el retorno de la información de error, necesitamos definir un valor de retorno de error de interfaz unificado. A través del diseño unificado del valor de retorno de error de la interfaz, podemos estandarizar el manejo de varios errores por parte de la persona que llama, proporcionar indicaciones de error más detalladas y precisas, y ayudar al backend a realizar el diseño estandarizado del valor de retorno de la interfaz. Por lo tanto, el diseño del valor de retorno de error de la interfaz no es solo el procesamiento estandarizado de la información de error, sino que también implica el diseño de errores comerciales. Tal diseño puede mejorar efectivamente la eficiencia y la mantenibilidad de la interfaz.

Definición de código de error

De acuerdo con http statsel error generalmente se puede dividir en las siguientes categorías

  1. 200: La solicitud fue exitosa
  2. 400: Solicitar error de parámetro
  3. 401: acceso no autorizado
  4. 403: Indica que el acceso al recurso está prohibido.
  5. 404: Indica que no se encontró el recurso.
  6. 500: Indica un error interno del servidor.

Para el diseño del código de error, puede utilizar el código de error http + código de error personalizado api de tres dígitos, que es un total de dígitos 6. Específicamente, lo que representa cada módulo se puede definir de acuerdo con su propia lógica comercial. , los dígitos corresponden a diferentes módulos

El formato de error correspondiente es el siguiente

interfaz de error

package cn.soboys.springbootrestfulapi.common.error;

/**
 * @author 公众号 程序员三时
 * @version 1.0
 * @date 2023/5/2 21:33
 * @webSite https://github.com/coder-amiao
 * 错误码接口,凡各模块错误码枚举类,皆须为此接口的子类型
 */
public interface ErrorCode {
    Integer getCode();

    String getMessage();

    boolean getSuccess();
}

Enumeración de implementación de errores personalizados

package cn.soboys.springbootrestfulapi.common.error;

/**
 * @author 公众号 程序员三时
 * @version 1.0
 * @date 2023/5/2 21:36
 * @webSite https://github.com/coder-amiao
 */
public enum CommonErrorCode implements ErrorCode {

    NOT_FOUND(false, 404, "接口不存在"),
    FORBIDDEN(false, 403, "资源拒绝访问"),
    UNAUTHORIZED(false, 401, "未认证(签名错误)"),
    INTERNAL_SERVER_ERROR(false, 500, "服务网络不可用"),
    PARAM_ERROR(false, 110001, "参数错误");



    CommonErrorCode(Boolean success, Integer code, String message) {
        this.success = success;
        this.code = code;
        this.message = message;

    }

    /**
     * 响应是否成功
     */
    private Boolean success;
    /**
     * 响应状态码
     */
    private Integer code;
    /**
     * 响应信息
     */
    private String message;


    @Override
    public Integer getCode() {
        return code;
    }

    @Override
    public String getMessage() {
        return message;
    }

    @Override
    public boolean getSuccess() {
        return success;
    }


}

Manejo de errores de excepción global

package cn.soboys.springbootrestfulapi.common.exception;


import cn.hutool.core.collection.CollectionUtil;
import cn.soboys.springbootrestfulapi.common.error.CommonErrorCode;
import cn.soboys.springbootrestfulapi.common.resp.R;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.WebRequest;

import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.List;
import java.util.stream.Collectors;


/**
 * @author 公众号 程序员三时
 * @version 1.0
 * @date 2023/4/29 00:21
 * @webSite https://github.com/coder-amiao
 * 统一异常处理器
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 通用异常处理方法
     **/
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public R error(Exception e, WebRequest request) {
        e.printStackTrace();
        return R.setResult(CommonErrorCode.INTERNAL_SERVER_ERROR)
                .request(request.getDescription(true))
                .errorMsg(e.getMessage());
    }



    /**
     * 处理 form data方式调用接口对象参数校验失败抛出的异常
     */
    @ExceptionHandler(BindException.class)
    @ResponseBody
    public R BindExceptionHandler(BindException e) {
        String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
        return R.failure().code(CommonErrorCode.PARAM_ERROR.getCode()).message(message);
    }

    /**
     * 处理Get请求中 验证路径中 单个参数请求失败抛出异常
     * @param e
     * @return
     */
    @ExceptionHandler(ConstraintViolationException.class)
    public R ConstraintViolationExceptionHandler(ConstraintViolationException e) {
        String message = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining());
        return R.failure().code(CommonErrorCode.PARAM_ERROR.getCode()).message(message);
    }


    /**
     * 处理 json 请求体调用接口对象参数校验失败抛出的异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public R jsonParamsException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        String msg=";";

        for (FieldError fieldError : bindingResult.getFieldErrors()) {
             msg = String.format("%s%s;", fieldError.getField(), fieldError.getDefaultMessage())+msg;
        }
        return R.failure().code(CommonErrorCode.PARAM_ERROR.getCode()).message(msg);
    }

    /**
     * 自定义异常处理方法
     *
     * @param e
     * @return
     */
    @ExceptionHandler(BusinessException.class)
    @ResponseBody
    public R error(BusinessException e) {
        e.printStackTrace();
        return R.failure().message(e.getMessage()).code(e.getCode());
    }

}

El código del proyecto específico se ha sincronizado con github, y en el futuro se mejorará y actualizará una serie de herramientas integradas de andamiaje, que se pueden usar de forma inmediata.

Supongo que te gusta

Origin blog.csdn.net/u011738045/article/details/130491967
Recomendado
Clasificación