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

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


The following commit(s) were added to refs/heads/3.2 by this push:
     new 4be8594bde fix(3.2): injvm invoker throws ClassCastException (#14346)
4be8594bde is described below

commit 4be8594bdefa3b941d062cbcee0794a3718c58b1
Author: caoyanan666 <[email protected]>
AuthorDate: Thu Jun 20 09:41:36 2024 +0800

    fix(3.2): injvm invoker throws ClassCastException (#14346)
    
    * fix injvm invoker throws ClassCastException
    
    * fix unit test
    
    * fix unit test
    
    * fix NPE
    
    ---------
    
    Co-authored-by: caoyanan <[email protected]>
---
 .../apache/dubbo/rpc/protocol/injvm/InjvmInvoker.java  | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git 
a/dubbo-rpc/dubbo-rpc-injvm/src/main/java/org/apache/dubbo/rpc/protocol/injvm/InjvmInvoker.java
 
b/dubbo-rpc/dubbo-rpc-injvm/src/main/java/org/apache/dubbo/rpc/protocol/injvm/InjvmInvoker.java
index 68054d7ddb..13e6a0f987 100644
--- 
a/dubbo-rpc/dubbo-rpc-injvm/src/main/java/org/apache/dubbo/rpc/protocol/injvm/InjvmInvoker.java
+++ 
b/dubbo-rpc/dubbo-rpc-injvm/src/main/java/org/apache/dubbo/rpc/protocol/injvm/InjvmInvoker.java
@@ -36,6 +36,7 @@ import org.apache.dubbo.rpc.Result;
 import org.apache.dubbo.rpc.RpcContext;
 import org.apache.dubbo.rpc.RpcException;
 import org.apache.dubbo.rpc.RpcInvocation;
+import org.apache.dubbo.rpc.model.ConsumerModel;
 import org.apache.dubbo.rpc.model.MethodDescriptor;
 import org.apache.dubbo.rpc.model.ServiceModel;
 import org.apache.dubbo.rpc.protocol.AbstractInvoker;
@@ -317,11 +318,18 @@ public class InjvmInvoker<T> extends AbstractInvoker<T> {
         }
 
         Object value = originValue;
-        ClassLoader cl = Thread.currentThread().getContextClassLoader();
+        ClassLoader contextClassLoader = 
Thread.currentThread().getContextClassLoader();
         try {
-            ServiceModel consumerServiceModel = getUrl().getServiceModel();
-            if (consumerServiceModel != null) {
-                
Thread.currentThread().setContextClassLoader(consumerServiceModel.getClassLoader());
+            // 1. By default, the classloader of the current Thread is the 
consumer class loader.
+            ClassLoader consumerClassLoader = contextClassLoader;
+            ServiceModel serviceModel = getUrl().getServiceModel();
+            // 2. If there is a ConsumerModel in the url, the classloader of 
the ConsumerModel is consumerLoader
+            if (Objects.nonNull(serviceModel) && serviceModel instanceof 
ConsumerModel) {
+                consumerClassLoader = serviceModel.getClassLoader();
+            }
+            // 3. request result copy
+            if (Objects.nonNull(consumerClassLoader)) {
+                
Thread.currentThread().setContextClassLoader(consumerClassLoader);
                 Type[] returnTypes = RpcUtils.getReturnTypes(invocation);
                 if (returnTypes == null) {
                     return originValue;
@@ -334,7 +342,7 @@ public class InjvmInvoker<T> extends AbstractInvoker<T> {
             }
             return value;
         } finally {
-            Thread.currentThread().setContextClassLoader(cl);
+            Thread.currentThread().setContextClassLoader(contextClassLoader);
         }
     }
 

Reply via email to