Result

接口返回类型

import lombok.Data;
import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;

// 封装后返回的字段
@Data
@Setter
@Getter
public class Result<T> implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    private Integer code;
    private String msg;
    private T data;
}

ResultEnum

状态码及描述信息枚举

import lombok.Getter;

@Getter
public enum ResultEnum {

    // 根据需要列举自己的枚举
    SUCCESS(200, "请求成功"),
    FAIL(500, "请求失败");

    private final Integer code;
    private final String msg;

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

}

AjaxResult

返回数据时所调用的方法

public class AjaxResult {
    
    // 成功,不带有数据
    public static <T> Result<T> success() {
        return common(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMsg(), null);
    }

    // 成功,带有数据
    public static <T> Result<T> success(T data) {
        return common(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMsg(), data);
    }

    // 失败,不带有数据
    public static <T> Result<T> fail() {
        return common(ResultEnum.FAIL.getCode(), ResultEnum.FAIL.getMsg(), null);
    }

    // 失败,带有数据
    public static <T> Result<T> fail(String msg) {
        return common(ResultEnum.FAIL.getCode(), msg, null);
    }

    /**
     * 公共响应方法
     */
    private static <T> Result<T> common(Integer code, String msg, T data) {
        Result<T> result = new Result<>();
        result.setCode(code);
        result.setMsg(msg);
        result.setData(data);
        return result;
    }
}

示例

@PostMapping("test")
public Result<String> test(@RequestParam("name") String name) {
	return AjaxResult.success("OK: " + name);
}

自定义异常

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

@Data
@Setter
@Getter
@EqualsAndHashCode(callSuper = true)
public class SelfException extends RuntimeException {

    private String message;

    public SelfException(String message) {
        this.message = message;
    }

    public SelfException(String message, Throwable e) {
        super(message);
        this.message = message;
    }

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

全局异常处理

import com.sun.result.AjaxResult;
import com.sun.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.validation.ConstraintViolationException;
import java.util.List;

@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 参数校验异常,pom文件需引入 spring-boot-starter-validation 依赖
     */
    @ExceptionHandler(ConstraintViolationException.class)
    @ResponseBody
    public Result<Object> error(Exception e) {
        log.error("参数校验异常:{}", e.getMessage());
        return AjaxResult.fail(e.getMessage());
    }

    /**
     * 参数校验异常,pom文件需引入 spring-boot-starter-validation 依赖
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public Result<Object> error(MethodArgumentNotValidException e) {
        // 获取异常体
        BindingResult bindingResult = e.getBindingResult();
        // 从异常体中获取所有异常列表
        List<FieldError> errors = bindingResult.getFieldErrors();
        // 要返回的字符串,拼接的是参数名称以及对应的报错提示
        StringBuilder messageBuilder = new StringBuilder();
        String message = null;
        for (FieldError error : errors) {
            // 报错的参数
            String field = error.getField();
            // 报错的信息
            message = error.getDefaultMessage();
            // 拼接参数名称以及对应的报错提示
            messageBuilder.append(field).append("\t").append(message).append("\n");
        }
        log.error("参数校验异常详情:{}", messageBuilder);
        return AjaxResult.fail(message);
    }

    /**
     * 自定义异常
     */
    @ExceptionHandler(SelfException.class)
    @ResponseBody
    public Result<Object> error(SelfException e) {
        log.error("自定义异常:{}", e.getMessage());
        return AjaxResult.fail(e.getMessage());
    }

    /**
     * 空指针异常
     */
    @ExceptionHandler(NullPointerException.class)
    @ResponseBody
    public Result<Object> error(NullPointerException e) {
        log.error("空指针异常:{}", e.getMessage());
        return AjaxResult.fail("空指针异常");
    }

    /**
     * 拦截运行时异常
     */
    @ExceptionHandler(value = RuntimeException.class)
    @ResponseBody
    public Result<Object> runtimeExceptionHandle(RuntimeException e) {
        log.error("捕捉到运行时异常:{}", e.getMessage());
        return AjaxResult.fail("系统运行中异常");
    }

    /**
     * 兜底异常,捕获系统级异常
     */
    @ExceptionHandler(value = Throwable.class)
    @ResponseBody
    public Result<Object> throwableHandle(Throwable throwable) {
        log.error("捕获系统级异常:{}", throwable.getMessage());
        return AjaxResult.fail("系统程序异常");
    }

}
Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐