You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2022/02/11 02:00:07 UTC

[dubbo] branch 3.0 updated: [3.0] Fix Dubbo Refer failed if a generic class's dependency is incomplete (#9669)

This is an automated email from the ASF dual-hosted git repository.

albumenj pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.0 by this push:
     new fac92b5  [3.0] Fix Dubbo Refer failed if a generic class's dependency is incomplete (#9669)
fac92b5 is described below

commit fac92b554fe6ae86b05e1b8feaa8533fdcce49d3
Author: Albumen Kevin <jh...@gmail.com>
AuthorDate: Fri Feb 11 09:59:33 2022 +0800

    [3.0] Fix Dubbo Refer failed if a generic class's dependency is incomplete (#9669)
    
    * [3.0] Fix Dubbo Refer failed if a generic class's dependency is incomplete
    
    * fix refer
    
    * fix client create proxy
---
 .../dubbo/config/AbstractInterfaceConfig.java      |  9 +++++++-
 .../dubbo/rpc/proxy/AbstractProxyFactory.java      | 24 ++++++++++++++++++++--
 2 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java b/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
index 64d6996..72cd1da 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
@@ -317,7 +317,14 @@ public abstract class AbstractInterfaceConfig extends AbstractMethodConfig {
 
             // Auto create MethodConfig/ArgumentConfig according to config props
             Map<String, String> configProperties = subPropsConfiguration.getProperties();
-            Method[] methods = interfaceClass.getMethods();
+            Method[] methods;
+            try {
+                methods = interfaceClass.getMethods();
+            } catch (Throwable e) {
+                // NoClassDefFoundError may be thrown if interface class's dependency jar is missing
+                return;
+            }
+
             for (Method method : methods) {
                 if (ConfigurationUtils.hasSubProperties(configProperties, method.getName())) {
                     MethodConfig methodConfig = getMethodByName(method.getName());
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/AbstractProxyFactory.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/AbstractProxyFactory.java
index f65576c..c562ed2 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/AbstractProxyFactory.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/AbstractProxyFactory.java
@@ -16,6 +16,8 @@
  */
 package org.apache.dubbo.rpc.proxy;
 
+import org.apache.dubbo.common.logger.Logger;
+import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.utils.ClassUtils;
 import org.apache.dubbo.common.utils.ReflectUtils;
 import org.apache.dubbo.common.utils.StringUtils;
@@ -42,6 +44,8 @@ public abstract class AbstractProxyFactory implements ProxyFactory {
         EchoService.class, Destroyable.class
     };
 
+    private static final Logger logger = LoggerFactory.getLogger(AbstractProxyFactory.class);
+
     @Override
     public <T> T getProxy(Invoker<T> invoker) throws RpcException {
         return getProxy(invoker, false);
@@ -66,12 +70,14 @@ public abstract class AbstractProxyFactory implements ProxyFactory {
             }
         }
 
+        Class<?> realInterfaceClass = null;
         if (generic) {
             try {
                 // find the real interface from url
                 String realInterface = invoker.getUrl().getParameter(Constants.INTERFACE);
                 ClassLoader classLoader = getClassLoader(invoker);
-                interfaces.add(ReflectUtils.forName(classLoader, realInterface));
+                realInterfaceClass = ReflectUtils.forName(classLoader, realInterface);
+                interfaces.add(realInterfaceClass);
             } catch (Throwable e) {
                 // ignore
             }
@@ -84,7 +90,21 @@ public abstract class AbstractProxyFactory implements ProxyFactory {
         interfaces.add(invoker.getInterface());
         interfaces.addAll(Arrays.asList(INTERNAL_INTERFACES));
 
-        return getProxy(invoker, interfaces.toArray(new Class<?>[0]));
+        try {
+            return getProxy(invoker, interfaces.toArray(new Class<?>[0]));
+        } catch (Throwable t) {
+            if (generic) {
+                if (realInterfaceClass != null) {
+                    interfaces.remove(realInterfaceClass);
+                }
+                interfaces.remove(invoker.getInterface());
+
+                logger.error("Error occur when creating proxy. Invoker is in generic mode. Trying to create proxy without real interface class.", t);
+                return getProxy(invoker, interfaces.toArray(new Class<?>[0]));
+            } else {
+                throw t;
+            }
+        }
     }
 
     private <T> ClassLoader getClassLoader(Invoker<T> invoker) {