spring boot 之 统一接口返回封装和全局异常处理
统一接口返回封装和全局异常处理
·
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("系统程序异常");
}
}
更多推荐


所有评论(0)