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>

 

posted @ 2020-12-03 19:46  ☆♂安♀★  阅读(618)  评论(0编辑  收藏  举报