• Feign调用全局异常处理解决


    异常信息形如:TestService#addRecord(ParamVO) failed and no fallback available.

    对于failed and no fallback available.这种异常信息,是因为项目开启了熔断:

    feign.hystrix.enabled: true
    

    当调用服务时抛出了异常,却没有定义fallback方法,就会抛出上述异常。由此引出了第一个解决方式。

    解决方案:

    自定义Feign解析器:

    import com.alibaba.fastjson.JSONException;
    import com.alibaba.fastjson.JSONObject;
    import com.crecgec.baseboot.jsoncore.exception.BaseException;
    import feign.Response;
    import feign.Util;
    import feign.codec.ErrorDecoder;
    import org.springframework.context.annotation.Configuration;
    
    import java.io.IOException;
    
    @Configuration
    public class FeignErrorDecoder implements ErrorDecoder {
    
        @Override
        public Exception decode(String methodKey, Response response) {
            try {
                // 这里直接拿到我们抛出的异常信息
                String message = Util.toString(response.body().asReader());
                try {
                    JSONObject jsonObject = JSONObject.parseObject(message);
                    return new BaseException(jsonObject.getString("resultMsg"), jsonObject.getInteger("resultCode"));
                } catch (JSONException e) {
                    e.printStackTrace();
                }
    
            } catch (IOException ignored) {
            }
            return decode(methodKey, response);
        }
    }
    
    

    定义系统的异常类

    public class BaseException extends RuntimeException {
        private int status ;
     
        public int getStatus() {
            return status;
        }
     
        public void setStatus(int status) {
            this.status = status;
        }
     
        public BaseException() {
        }
     
        public BaseException(String message, int status) {
            super(message);
            this.status = status;
        }
     
        public BaseException(String message) {
            super(message);
        }
     
        public BaseException(String message, Throwable cause) {
            super(message, cause);
        }
     
        public BaseException(Throwable cause) {
            super(cause);
        }
     
        public BaseException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
            super(message, cause, enableSuppression, writableStackTrace);
        }
    }
    

    统一异常拦截转换对应的异常信息返回前端

    public class ResultSet {
    
        /**
         * 返回的状态码
         */
        private Integer resultCode;
    
        /**
         * 返回的消息
         */
        private String resultMsg;
    
        /**
         * 返回的数据
         */
        private Object data;
    
        public ResultSet() {
        }
    
        public ResultSet(Integer resultCode, String resultMsg) {
            this.resultCode = resultCode;
            this.resultMsg = resultMsg;
        }
    
        public ResultSet(Integer resultCode, String resultMsg, Object data) {
            this.resultCode = resultCode;
            this.resultMsg = resultMsg;
            this.data = data;
        }
    
        public Integer getResultCode() {
            return resultCode;
        }
    
        public void setResultCode(Integer resultCode) {
            this.resultCode = resultCode;
        }
    
        public String getResultMsg() {
            return resultMsg;
        }
    
        public void setResultMsg(String resultMsg) {
            this.resultMsg = resultMsg;
        }
    
        public Object getData() {
            return data;
        }
    
        public void setData(Object data) {
            this.data = data;
        }
    }
    
    

    全局异常类处理配置:

    @ExceptionHandler(value = BaseException.class)
    public ResultSet defaultErrorHandler(HttpServletRequest req, HttpServletResponse resp, BaseException e) {
        ResultSet resultSet = new ResultSet();
    
        if (e.getStatus() == 400) {
            resultSet.setResultCode(-1);
            resultSet.setResultMsg(e.getMessage());
            resultSet.setData(null);
            resp.setStatus(400);
        } else {
            resp.setStatus(500);
            if(logger.isErrorEnabled()){
                logger.error("系统异常,请联系系统开发人员进行处理", e);
            }
            resultSet.setResultCode(-1);
            resultSet.setResultMsg(e.getMessage());
            resultSet.setData(null);
        }
    
        return resultSet;
    }
    

    这样就能完成了feign接收异常处理的自定义异常信息!

  • 相关阅读:
    移动硬盘加密方法赏析
    Windows7下怎么对文件或者文件夹进行EFS加密
    win7怎么设置电脑自动关机
    电脑定时关机怎么设置
    用vb编程给u盘加密
    中医课件集合
    在手机上查询药品信息?PEP移动掌上药物信息参考
    【好站收藏】六脉医学资料下载网sixmed.cn
    百度进军C2C叫板淘宝电子商务领域竞争升级
    IBM 笔记本T43键盘帽安装手记
  • 原文地址:https://www.cnblogs.com/zhaokejin/p/15626400.html
Copyright © 2020-2023  润新知