xujunwei před 3 roky
rodič
revize
639e63c149

+ 3 - 2
framework-boot/src/main/java/com/mrxu/framework/boot/feign/FeignProviderException.java

@@ -13,7 +13,7 @@ import java.io.Serializable;
  * @Description: rpc 服务端异常
  */
 @Data
-public class FeignProviderException implements Serializable {
+public class FeignProviderException extends RuntimeException implements Serializable {
 
     // 是否是业务异常
     private boolean isBusinessException;
@@ -30,7 +30,8 @@ public class FeignProviderException implements Serializable {
 
     public FeignProviderException(){}
 
-    public FeignProviderException(boolean isBusinessException,String serviceName, BaseCode baseCode) {
+    public FeignProviderException(boolean isBusinessException,String serviceName,BaseCode baseCode,Throwable cause) {
+        super(cause);
         this.isBusinessException = isBusinessException;
         this.serviceName = serviceName;
         this.fromServiceName = RpcRequestInfo.getFromServiceName();

+ 1 - 7
framework-boot/src/main/java/com/mrxu/framework/boot/handle/FeignErrorDecoder.java

@@ -36,13 +36,7 @@ public class FeignErrorDecoder implements ErrorDecoder {
             String rs = Util.toString(response.body().asReader());
             FeignProviderException feignError = JSONObject.parseObject(rs, FeignProviderException.class);
             log.info("rpc 远程调用返回错误:{}",rs);
-            if(feignError.isBusinessException()) {
-                throw new BusinessException(feignError.getCode(),feignError.getMsg());
-            }
-            else {
-                String msg = feignError.getFromServiceName()+"->"+feignError.getServiceName()+"错误:"+feignError.getMsg();
-                throw new RuntimeException(msg);
-            }
+            throw feignError;
         }
         catch (IOException ignored) {
             log.error("rpc 返回数据异常",ignored);

+ 10 - 6
framework-boot/src/main/java/com/mrxu/framework/boot/handle/FeignProviderExceptionHandler.java

@@ -43,24 +43,28 @@ public class FeignProviderExceptionHandler {
         if(e instanceof BusinessException) {
             BusinessException error = (BusinessException)e;
             log.warn(e.getMessage());
-            return rendError(true,new BaseCode(error.getCode(),error.getMsg()));
+            return rendError(true,new BaseCode(error.getCode(),error.getMsg()),e);
+        }
+        // 本身是微服务,调用其他微服务出错
+        else if(e instanceof FeignProviderException) {
+            return e;
         }
         else if(e instanceof MethodArgumentNotValidException) {
             MethodArgumentNotValidException error = (MethodArgumentNotValidException)e;
             BindingResult result = error.getBindingResult();
             log.warn("请求参数错误:{}",result.getFieldError().getDefaultMessage());
-            return rendError(true,BaseCode.ERR_PARAMS_VALID);
+            return rendError(true,BaseCode.ERR_PARAMS_VALID,e);
         }
         else if(e instanceof MissingServletRequestParameterException) {
             log.warn("请求缺少参数:{}",e.getMessage());
-            return rendError(true,BaseCode.ERR_PARAMS_MISS);
+            return rendError(true,BaseCode.ERR_PARAMS_MISS,e);
         }
         log.error("系统错误:{}",e.getMessage(), e);
-        return rendError(false,new BaseCode(BaseCode.ERROR.code,e.getMessage()));
+        return rendError(false,new BaseCode(BaseCode.ERROR.code,e.getMessage()),e);
     }
 
-    public Object rendError(boolean isBusinessException,BaseCode code) {
-        FeignProviderException exception = new FeignProviderException(isBusinessException,serviceName,code);
+    public Object rendError(boolean isBusinessException,BaseCode code,Throwable cause) {
+        FeignProviderException exception = new FeignProviderException(isBusinessException,serviceName,code,cause);
         return exception;
     }
 

+ 6 - 0
framework-boot/src/main/java/com/mrxu/framework/boot/handle/WebExceptionHandler.java

@@ -1,6 +1,7 @@
 package com.mrxu.framework.boot.handle;
 
 import com.mrxu.framework.boot.entity.ResponseObj;
+import com.mrxu.framework.boot.feign.FeignProviderException;
 import com.mrxu.framework.boot.web.ServletUtils;
 import com.mrxu.framework.common.util.BaseCode;
 import com.mrxu.framework.common.util.BusinessException;
@@ -47,6 +48,11 @@ public class WebExceptionHandler {
             logger.warn(e.getMessage());
             return rendError(new BaseCode(error.getCode(),error.getMsg()));
         }
+        else if(e instanceof FeignProviderException) {
+            FeignProviderException error = (FeignProviderException)e;
+            logger.warn(e.getMessage());
+            return rendError(new BaseCode(error.getCode(),error.getMsg()));
+        }
         else if(e instanceof MethodArgumentNotValidException) {
             BindingResult result = ((MethodArgumentNotValidException)e).getBindingResult();
             FieldError error = result.getFieldError();