首先有一个自定义的返回结果集
package com.lzq.vo;
import lombok.Builder;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.io.Serializable;
@Data
@Builder
@Slf4j
public class ResultVO implements Serializable {
private static final long serialVersionUID = -5827350961263966721L;
@ApiModelProperty("返回的状态")
private Boolean success = true;
@ApiModelProperty("返回的状态码")
private Integer code = 200;
@ApiModelProperty("返回的消息")
private String message;
@ApiModelProperty("返回的数据")
private Object data;
private ResultVO() {
}
private ResultVO(Boolean success, Integer code, String message, Object data) {
this.success = success;
this.code = code;
this.message = message;
this.data = data;
}
public static ResultVO setResult(Boolean success, Integer code, String message, Object data) {
return ResultVO.builder()
.success(success)
.code(code)
.message(message)
.data(data)
.build();
}
public static ResultVO successResult(Integer code, String message, Object data) {
return setResult(true, code, message, data);
}
public static ResultVO successResult(String message, Object data) {
return setResult(true, Code.SUCCESS.getCode(), message, data);
}
public static ResultVO successResult(String message) {
return setResult(true, Code.SUCCESS.getCode(), message, null);
}
public static ResultVO failResult(Integer code, String message) {
return setResult(false, code, message, null);
}
public static ResultVO failResult(String message) {
return setResult(false, Code.FAIL.getCode(), message, null);
}
}
自己定义一个自定义的业务异常类,当然不定义也行
package com.lzq.exception;
import com.lzq.vo.Code;
import lombok.Data;
@Data
public class BizException extends RuntimeException {
private static final long serialVersionUID = -1576580252530183280L;
private Integer code;
private String message;
public BizException() {
}
public BizException(String message) {
this(Code.FAIL.getCode(),message);
}
public BizException(Integer code, String message) {
this.code = code;
this.message = message;
}
}
定义全局的异常拦截
package com.lzq.handler;
import com.lzq.vo.Code;
import com.lzq.vo.ResultVO;
import com.lzq.exception.BizException;
import lombok.extern.slf4j.Slf4j;
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.servlet.NoHandlerFoundException;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Map;
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
@ResponseBody
public ResultVO defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
//404资源直接不打印,直接返回
if (e instanceof NoHandlerFoundException) {
return ResultVO.failResult(Code.NoRESOURCES.getCode(), "请求路径未找到");
}
log.error("<<<===访问出错,开始输出日志===>>>");
log.error("访问的路径:{}", req.getRequestURL());
StringBuilder builder = new StringBuilder("#");
Map<String, String[]> parameterMap = req.getParameterMap();
parameterMap.forEach((k, v) -> {
builder.append(k).append(":").append(Arrays.toString(v)).append("#");
});
log.error("访问的参数:{}", builder);
ResultVO result = null;
//自己的业务逻辑错误
if (e instanceof BizException) {
result = ResultVO.failResult(((BizException) e).getCode(), e.getMessage());
}
//如果前面没有匹配到,则匹配通用的500错误
if (result == null) {
result = ResultVO.failResult(Code.FAIL.getCode(), "服务器内部错误");
}
log.error("状态码:{}", result.getCode());
log.error("报错信息:{}", result.getMessage());
log.error("<<<===异常信息栈开始打印===>>>", e);
return result;
}
}