返回信息封装
/**
* @Author :
* @Time : 2020/5/24
* @Description: 返回错误信息
**/
public interface IBizError {
String getCode();
String getMsg();
}
/**
* @Author :
* @Time : 2020/5/24
* @Description: 返回错误信息
**/
public enum BizErrorEnum implements IBizError {
/***/
SUCCESS("0000", "success"),
//1000以下为系统级错误
SYSTEM_ERROR("0001", "system error");
BizErrorEnum(String code, String msg) {
this.code = code;
this.msg = msg;
}
private String code;
private String msg;
@Override
public String getCode() {
return this.code;
}
@Override
public String getMsg() {
return this.msg;
}
}
返回数据格式类
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.io.Serializable;
/**
* @Author :
* @Time : 2020/8/3
* @Description: 统一返回值
**/
@Data
@Slf4j
public class BizResult<T> implements Serializable {
private String code;
private T data;
private String msg;
public static <T> BizResult<T> success(T obj) {
BizResult bizResult = new BizResult();
bizResult.setCode(BizErrorEnum.SUCCESS.getCode());
bizResult.setMsg(BizErrorEnum.SUCCESS.getMsg());
bizResult.setData(obj);
return bizResult;
}
public static <T> BizResult<T> error(T obj) {
BizResult bizResult = new BizResult();
bizResult.setCode(BizErrorEnum.SYSTEM_ERROR.getCode());
bizResult.setMsg(BizErrorEnum.SYSTEM_ERROR.getMsg());
bizResult.setData(obj);
return bizResult;
}
public static <T> BizResult<T> error(String code, String msg) {
BizResult bizResult = new BizResult();
bizResult.setCode(code);
bizResult.setMsg(msg);
return bizResult;
}
/**
* 判断是否返回成功,失败并打印日志
*
* @param bizResult
*/
public static Boolean checkIsSuccess(BizResult bizResult) {
if (bizResult == null || !bizResult.getCode().equals(BizErrorEnum.SUCCESS.getCode())) {
return false;
}
return true;
}
}
全局返回封装
import com.netflix.hystrix.exception.HystrixRuntimeException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.validation.ObjectError;
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 org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
import java.util.List;
import java.util.stream.Collectors;
@ControllerAdvice(value = {"扫描包路径", "org.springframework.boot.autoconfigure.web.servlet.error"})
@Slf4j
public class BizResponseBodyAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class converterType) {
return returnType.getParameterType() != BizResult.class;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
return BizResult.success(body);
}
@ResponseBody
@ExceptionHandler(HystrixRuntimeException.class)
public BizResult hystrixRuntimeException(HystrixRuntimeException e) {
log.error(e.getMessage(), e);
return BizResult.error(BizErrorEnum.SYSTEM_ERROR.getCode(), "远程接口调用超时");
}
@ResponseBody
@ExceptionHandler(DataIntegrityViolationException.class)
public BizResult dataIntegrityViolationException(DataIntegrityViolationException e) {
log.error(e.getMessage(), e);
return BizResult.error(BizErrorEnum.SYSTEM_ERROR.getCode(), "数据持久化失败");
}
@ResponseBody
@ExceptionHandler(HttpMessageNotReadableException.class)
public BizResult httpMessageNotReadableException(HttpMessageNotReadableException e) {
log.error(e.getMessage(), e);
if (e.getLocalizedMessage().contains("JSON parse error")) {
return BizResult.error(BizErrorEnum.SYSTEM_ERROR.getCode(), "输入参数异常,请核实!");
}
return BizResult.error(BizErrorEnum.SYSTEM_ERROR.getCode(), e.getLocalizedMessage());
}
@ResponseBody
@ExceptionHandler(IllegalStateException.class)
public BizResult illegalStateException(IllegalStateException e) {
log.error(e.getMessage(), e);
if (e.getLocalizedMessage().contains("io.undertow.server.RequestTooBigException")) {
return BizResult.error(BizErrorEnum.SYSTEM_ERROR.getCode(), "文件大小超出最大限制,最大可上传10M文件");
}
return BizResult.error(BizErrorEnum.SYSTEM_ERROR.getCode(), e.getLocalizedMessage());
}
@ResponseBody
@ExceptionHandler(MethodArgumentTypeMismatchException.class)
public BizResult methodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e) {
log.error(e.getMessage(), e);
return BizResult.error(BizErrorEnum.SYSTEM_ERROR.getCode(), "输入参数异常,请核实!");
}
@ResponseBody
@ExceptionHandler(IllegalArgumentException.class)
public BizResult illegalArgumentException(IllegalArgumentException e) {
log.error(e.getMessage(), e);
return BizResult.error(BizErrorEnum.SYSTEM_ERROR.getCode(), e.getLocalizedMessage());
}
@ResponseBody
@ExceptionHandler(MethodArgumentNotValidException.class)
public BizResult methodArgumentNotValid(MethodArgumentNotValidException e) {
List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
String message = allErrors.stream().map(s -> s.getDefaultMessage()).collect(Collectors.joining(";"));
log.error(e.getMessage(), e);
return BizResult.error(BizErrorEnum.SYSTEM_ERROR.getCode(), message);
}
@ResponseBody
@ExceptionHandler(value = Exception.class)
public BizResult errorHandler(Exception ex) {
ex.printStackTrace();
return BizResult.error(BizErrorEnum.SYSTEM_ERROR.getCode(), ex.getLocalizedMessage());
}
}
需要jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
测试效果: