1.自定义异常
public class CustomizeException extends RuntimeException {
/**
* 错误代码
*/
private ComCode code;
/**
* 异常信息
*/
private Exception e;
public CustomizeException(ComCode code,Exception e){
this.code = code;
this.e = e;
}
public ComCode getCode() {
return code;
}
public Exception getE() {
return e;
}
}
2.自定义异常处理器
import com.google.common.collect.ImmutableMap;
@RestControllerAdvice
public class ExceptionCatch {
private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionCatch.class);
/**
* 定义map,配置异常类型所对应的错误代码
*/
private static ImmutableMap<Class<? extends Throwable>, ComCode> EXCEPTIONS;
/**
* 定义map的builder对象,去构建ImmutableMap
*/
protected static ImmutableMap.Builder<Class<? extends Throwable>, ComCode> builder = ImmutableMap.builder();
/**
* 捕获 CustomizeException 异常
* @param e
* @return
*/
@ExceptionHandler(CustomizeException.class)
//@ResponseBody
public Result exception(HttpServletRequest request, HandlerMethod method, CustomizeException e) {
LOGGER.error("{} catch exception : {}", e.getCode().message(),e.getE());
ComCode code = e.getCode();
Result result = new Result().setCodeAndMessage(code);
return result;
}
/**
* 参数校验统一异常处理
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResultVo handleBindException(MethodArgumentNotValidException e) {
FieldError fieldError = e.getBindingResult().getFieldError();
assert fieldError != null;
log.error("参数校验异常:{}({})", fieldError.getDefaultMessage(),fieldError.getField());
return ResultVo.error(Objects.requireNonNull(ResultCode.getMsg(fieldError.getDefaultMessage())));
}
/**
* 参数校验统一异常处理
*/
@ExceptionHandler(BindException.class)
public ResultVo handleBindException(BindException e) {
FieldError fieldError = e.getBindingResult().getFieldError();
assert fieldError != null;
log.error("参数校验异常:{}({})", fieldError.getDefaultMessage(),fieldError.getField());
return ResultVo.error(Objects.requireNonNull(ResultCode.getMsg(fieldError.getDefaultMessage())));
}
/**
* 捕获Exception此类异常
* @param exception
* @return
*/
@ExceptionHandler(Exception.class)
public Result exception(Exception exception){
//记录日志
LOGGER.error("catch exception:{}",exception.getMessage(),exception);
if(EXCEPTIONS == null){
//EXCEPTIONS构建成功
EXCEPTIONS = builder.build();
}
//从EXCEPTIONS中找异常类型所对应的错误代码,如果找到了将错误代码响应给用户,如果找不到给用户响应服务器内部错误异常
ComCode code = EXCEPTIONS.get(exception.getClass());
if(code != null){
return new Result().setCodeAndMessage(code);
}else{
//返回服务器内部错误异常
return new Result().setCodeAndMessage(ResultCode.INTERNAL_SERVER_ERROR);
}
}
static {
//定义异常类型所对应的错误代码
builder.put(RejectedExecutionException.class, ResultCode.REJECTED_EXECUTION);
builder.put(AccessDeniedException.class, ResultCode.AUTH_ACCESS_DENIED);
}
}
3.状态码接口
package com.mochain.moline.common.result;
public interface ComCode {
Integer getCode();
String getMsg();
}
4.状态码接口实现枚举
package com.mochain.moline.common.result;
public enum ResultCode implements ComCode {
SUCCESS(0,"SUCCESS"),
EXCEPTION(500,"EXCEPTION")
;
private Integer code;
private String msg;
ResultCode(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
@Override
public Integer getCode() {
return code;
}
@Override
public String getMsg() {
return msg;
}
}
5.通用返回值
package com.mochain.moline.common.result;
import com.mochain.moline.common.util.InternationalUtil;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.Serializable;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ResultVo implements Serializable {
private static final long serialVersionUID = -7617442560238858029L;
private Integer code;
private String msg;
private Object data;
/**
* 系统错误
*/
public static ResultVo error(ComCode comCode){
ResultVo resultVo = new ResultVo();
resultVo.setCode(comCode.getCode());
resultVo.setMsg(comCode.getMsg());
return resultVo;
}
/**
* 成功
*/
public static ResultVo ok(ComCode comCode){
ResultVo resultVo = new ResultVo();
resultVo.setCode(comCode.getCode());
resultVo.setMsg(comCode.getMsg());
return resultVo;
}
public static ResultVo ok(ComCode comCode, Object data){
ResultVo resultVo = new ResultVo();
resultVo.setCode(comCode.getCode());
resultVo.setMsg(comCode.getMsg());
resultVo.setData(data);
return resultVo;
}
}