java controller 异常捕获
package com.aiyusheng.framework.exception; import lombok.Data; /** * base异常类 * @author :cza * @date :2020/11/25 15:57 * @description : * @modyified By: */ @Data public class BaseException extends Exception { private String code; public BaseException(Throwable throwable){ super(throwable); } public BaseException(String msg){ super(msg); } public BaseException(String msg,Throwable throwable){ super(msg,throwable); } @Deprecated public BaseException(Throwable throwable,String msg,String code){ super(msg,throwable); this.code=code; } }
package com.aiyusheng.framework.exception; import com.aiyusheng.framework.core.enums.ReturnCode; import com.aiyusheng.framework.utils.CommUtil; import lombok.Data; import javax.swing.plaf.PanelUI; import java.io.Serializable; /** * 业务异常类 * @author :cza * @date :2020/11/25 15:57 * @description : * @modyified By: */ public class BusinessException extends BaseException implements Serializable { private static final long serialVersionUID = -3598204678161713009L; /** * 结果码 */ private String code; /** * 提示消息 */ private String msg; /** * 提示消息,用于填充properties中的{}参数 */ private String [] msgParams; /** * 功能描述:不带信息参数的异常<br> * @Param code * @Param throwable * @Return * @Author: cza * @Date: 2020-11-26 * */ public BusinessException(String code,Throwable throwable){ super(CommUtil.getResultMsg(code,null),throwable); this.code=code; this.setCode(code); } /** * 功能描述:不带信息参数的异常<br> * @Param code * @Param throwable * @Return * @Author: cza * @Date: 2020-11-26 * */ public BusinessException(ReturnCode returnCode){ super(returnCode.getMsg()); this.setCode(returnCode.getCode()); } public BusinessException(ReturnCode returnCode,String [] msgParams,Throwable throwable){ super(CommUtil.getResultMsg(returnCode.getMsg(),msgParams),throwable); this.code=returnCode.getCode(); //不直接传递引用是处于代码安全考虑,避免位置调用者修改引用内容 this.msgParams=msgParams.clone(); this.setCode(returnCode.getCode()); } /** * 功能描述:带一个信息参数的异常 * @Param: * @Return * @Author: chenzhian * @Date:2020-11-26 */ public BusinessException(String code,String msgParam,Throwable throwable){ super(CommUtil.getResultMsg(code, new String [] {msgParam}),throwable); this.code=code; //不直接传递引用是处于代码安全考虑,避免位置调用者修改引用内容 this.msgParams[0]=msgParam; this.setCode(code); } /** * 功能描述: 带多个信息参数的异常 * @Param: * @param code * @param msgParams * @param throwable * @Return: * @Author: chenzhian * @Date: 2020/11/26 15:43 * @Description: */ @Deprecated public BusinessException(String code,String [] msgParams,Throwable throwable) { super(CommUtil.getResultMsg(code,msgParams),throwable); this.code=code; //不直接传递引用是处于代码安全考虑,避免位置调用者修改引用内容 this.msgParams=msgParams.clone(); this.setCode(code); } /** * 功能描述: 带多个信息参数的异常 * @Param: * @param code * @param throwable * @param msgParams * @Return: * @Author: chenzhian * @Date: 2020/11/26 15:45 * @Description: */ public BusinessException(String code,Throwable throwable,String... msgParams) { super(CommUtil.getResultMsg(code,msgParams),throwable); this.code=code; //不直接传递引用是处于代码安全考虑,避免位置调用者修改引用内容 this.msgParams=msgParams.clone(); this.setCode(code); } /** * 功能描述: 异常信息构造函数,用于FA框架反射调用 * @Param: * @param resultMsg * @Return: * @Author: chenzhian * @Date: 2020/11/26 15:46 * @Description: */ public BusinessException(String resultMsg){ super(resultMsg); } @Override public String getCode(){ return code; } @Override public void setCode(String code){ this.code=code; } public String [] getMsgParams() { //不直接返回msgParams引用为了代码安全,避免被未知调用者修改引用的内容 return msgParams.clone(); } public void setMsgParams(String [] msgParams){ //不直接复制msgParams引用为了代码安全,避免被未知调用者修改引用的内容 this.msgParams=msgParams.clone(); } /** * 功能描述: * @Param: [returnCode, msgParam, throwable] * @Return: * @Author: * @Date: 2020/11/26 14:37 * @Description: public BusinessException(ReturnCode returnCode,String msgParam,Throwable throwable){ super(CommUtil.getResultMsg(returnCode.getMsg(), new String [] {msgParam}),throwable); this.code=returnCode.getCode(); //不直接传递引用是处于代码安全考虑,避免位置调用者修改引用内容 this.msgParams[0]=msgParam; this.setCode(returnCode.getCode()); }*/ }
package com.aiyusheng.framework.core; import com.aiyusheng.framework.core.enums.ReturnCode; import com.alibaba.fastjson.JSONPObject; import com.alibaba.fastjson.serializer.SerializerFeature; import com.fasterxml.jackson.databind.SerializationFeature; import lombok.Data; import lombok.experimental.Accessors; import org.apache.shiro.crypto.hash.Hash; import java.io.Serializable; import java.util.HashMap; import java.util.Map; /** * @author :cza * @date :2020/11/26 20:41 * @description : * @modyified By: */ @Data @Accessors(chain = true) public class ResponseResult<T> implements Serializable { private String code; private String msg; private T data; public ResponseResult(){ this(ReturnCode.Common.SUCCESS,null); } public ResponseResult(T data){ this(ReturnCode.Common.SUCCESS,data); } public ResponseResult(ReturnCode returnCode){ this(returnCode,null); } public ResponseResult(ReturnCode returnCode,T data){ //this(returnCode,null); this.code=returnCode.getCode(); this.msg=returnCode.getMsg(); } public ResponseResult(String code,String msg){ this.code=code; this.msg=msg; this.data=transferNull2EmptyFloag?(T)"":null; } public ResponseResult(String code,String msg,T data){ this.code=code; this.msg=msg; this.data=transNullToEmptyString(data); } public static <T> ResponseResult<T> success(T data){ return new ResponseResult<>(data); } public static <T> ResponseResult<T> success(T data,String message){ return new ResponseResult<>(data).setMsg(message); } public static <T> ResponseResult<T> success(){ return new ResponseResult<>(); } public static <T> ResponseResult<T> error(String errorMsg){ return new ResponseResult<>(ReturnCode.Common.RUNTIME_EXCEPTION.getCode(),errorMsg); } public static <T> ResponseResult<T> error(String errorCode,String errorMsg){ return new ResponseResult<>(errorCode,errorMsg); } /** * 功能描述:检查是否成功 * @Param: * @Return: boolean * @Author: chenzhian * @Date: 2020/11/27 11:13 * @Description: */ public boolean checkResult(){ return ReturnCode.Common.SUCCESS.getCode().equals(code); } /** * 功能描述:复制code和msg信息 * @Param: * @Return: com.aiyusheng.framework.core.ResponseResult<M> * @Author: chenzhian * @Date: 2020/11/27 11:18 * @Description: */ public <M> ResponseResult<M> copy(){ return new ResponseResult<>(this.code,this.msg); } /** * 功能描述: 复制code和msg信息,并设置data数据 * @Param: * @Return: com.aiyusheng.framework.core.ResponseResult<M> * @Author: chenzhian * @Date: 2020/11/27 11:18 * @Description: */ public <M> ResponseResult<M> copyAndSetData(){ return new ResponseResult<>(this.code,this.msg); } @Override public String toString() { Map<String,Object> jsonMap=new HashMap<>(); jsonMap.put("code",this.code); jsonMap.put("msg",this.msg); jsonMap.put("data",transNullToEmptyString(this.data)); return JSONPObject.toJSONString(jsonMap, SerializerFeature.WriteNullStringAsEmpty,SerializerFeature.WriteDateUseDateFormat); } @Deprecated private T transNullToEmptyString(T data) { if(null==data){ return transferNull2EmptyFloag?(T)"":data; } return data; } public static volatile boolean transferNull2EmptyFloag=false; }
package com.aiyusheng.framework.core.enums; /** * @author :cza * @date :2020/11/26 11:15 * @description : * @modyified By: */ public interface ReturnCode { public String getCode(); public String getMsg(); public String getMsg(String code); /** * 功能描述:定义框架级别的编码 <br> * @Param: * @Return * @Author: * @Date: */ public enum Common implements ReturnCode{ /** 成功 */ SUCCESS("00000","成功"), /** 服务器繁忙 fixme */ BUSINESS_PROCESS_FAILED("950001","服务器繁忙"), /* 字段校验非法 */ INVAID_PARAM("940001","字段校验非法"), /* 运行时异常 */ INVAID_REQUEST_MSG("940001","运行时异常"), /* token 校验不通过 1.1.8 版本之前是非法用户 */ INVAID_VIRTUAL_USER("940102","非法虚拟用户"), /* 请求参数错误() */ INVAID_REQUEST("940103","请求方式错误"), /* 运行时异常() */ RUNTIME_EXCEPTION("950102","运行时异常"), GATE_EXCEPTION("940502","网关繁忙"), CLIENT_ABORT("950504","请求超时"); private String code; private String msg; private Common(String code,String msg){ this.code=code; this.msg=msg; } public String getCode() { return code; } public String getMsg() { return msg; } public String getMsg(String code) { return msg; } } }
/**
* @author :cza
* @date :2020/11/25 15:56
* @description :
* @modyified By:
*/
import com.aiyusheng.framework.core.ResponseResult;
import com.aiyusheng.framework.core.enums.ReturnCode;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
import org.springframework.http.HttpStatus;
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.bind.annotation.ResponseStatus;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Arrays;
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
public static final String FINAL_MESSAGE="服务器内部错误,请联系系统管理员";
/**
* 功能描述:自定义后的异常处理
* @Param:
* @param ex
* @Return: com.aiyusheng.framework.core.ResponseResult
* @Author: chenzhian
* @Date: 2020/12/3 19:21
* @Description:
*/
@ExceptionHandler(value = BusinessException.class)
public ResponseResult BusinessExceptionHandle(BusinessException ex) {
ex.printStackTrace();
//记录日志
logger.error("\nBusinessExceptionHandle {}", getStackTrace(ex));
String code=ex.getCode();
String message=FINAL_MESSAGE;
if(ex.getMsgParams()!=null&&ex.getMsgParams().length>0){
message= Arrays.toString(ex.getMsgParams());
}
return new ResponseResult(ReturnCode.Common.BUSINESS_PROCESS_FAILED, "服务器内部错误,请联系系统管理员!");
}
/** 获取堆栈信息
* 功能描述:
* @Param:
* @param throwable
* @Return: java.lang.Throwable
* @Author: chenzhian
* @Date: 2020/12/3 19:25
* @Description:
*/
private String getStackTrace(Throwable throwable) {
StringWriter sw=new StringWriter();
PrintWriter pw=new PrintWriter(sw);
try {
throwable.printStackTrace(pw);
return sw.toString();
} finally {
pw.close();
}
}
/**
* 功能描述: 统一拦截自定义异常
* @Param:
* @param ex
* @Return: com.aiyusheng.framework.core.ResponseResult
* @Author: chenzhian
* @Date: 2020/12/3 19:21
* @Description:
*/
@ExceptionHandler(value = Exception.class)
public ResponseResult exceptionHandle(Exception ex) {
//根据某个类型进行具体返回
/*
if(e instanceof BadRequestException){
return new ResponseResult(400, e.getMessage());
} if(e instanceof NoAuthorityException){
return new BaseResponse(401, e.getMessage());
} if(e instanceof FailureException){
return new BaseResponse(500, e.getMessage());
} else {//其他未捕获异常
LOGGER.error("exception:{}", e.getMessage(), e);}*/
return new ResponseResult(ReturnCode.Common.BUSINESS_PROCESS_FAILED, "服务器内部错误,请联系系统管理员!");
}
/**
* 拦截@RequestBody上validate失败后抛出的异常:MethodArgumentNotValidException
*/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseResult parameterExceptionHandler(MethodArgumentNotValidException e) {
logger.error("exception:{}", e.getMessage());
return new ResponseResult(ReturnCode.Common.BUSINESS_PROCESS_FAILED, "服务器内部错误,请联系系统管理员!");
}
}
引用包
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.4</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> <version>9.0.33</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>${fastjson.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency> </dependencies>