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) {