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 2023/02/03 03:49:55 UTC

[dubbo] branch 3.1.6-release updated: Fix Class Check

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

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


The following commit(s) were added to refs/heads/3.1.6-release by this push:
     new c44873e9b2 Fix Class Check
c44873e9b2 is described below

commit c44873e9b2e2a9ecb0459dce6e85cdfc829b2300
Author: Albumen Kevin <jh...@gmail.com>
AuthorDate: Fri Feb 3 11:49:33 2023 +0800

    Fix Class Check
---
 .../common/utils/DefaultSerializeClassChecker.java |  2 +-
 .../META-INF/native-image/reflect-config.json      | 14 ++++++++++----
 .../apache/dubbo/rpc/filter/GenericImplFilter.java | 22 ++++++++++++++++------
 .../dubbo/rpc/filter/GenericImplFilterTest.java    | 13 +++++++------
 4 files changed, 34 insertions(+), 17 deletions(-)

diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/DefaultSerializeClassChecker.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/DefaultSerializeClassChecker.java
index 378a9bc49a..a385ddf593 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/DefaultSerializeClassChecker.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/DefaultSerializeClassChecker.java
@@ -117,7 +117,7 @@ public class DefaultSerializeClassChecker implements AllowClassNotifyListener {
 
     private Class<?> loadClass0(ClassLoader classLoader, String className) throws ClassNotFoundException {
         if (checkStatus == SerializeCheckStatus.DISABLE) {
-            return Class.forName(className, false, classLoader);
+            return ClassUtils.forName(className, classLoader);
         }
 
         long hash = MAGIC_HASH_CODE;
diff --git a/dubbo-native-plugin/src/main/resources/META-INF/native-image/reflect-config.json b/dubbo-native-plugin/src/main/resources/META-INF/native-image/reflect-config.json
index a5fe3bc351..3f57d4e6b5 100644
--- a/dubbo-native-plugin/src/main/resources/META-INF/native-image/reflect-config.json
+++ b/dubbo-native-plugin/src/main/resources/META-INF/native-image/reflect-config.json
@@ -2292,7 +2292,16 @@
     ]
   },
   {
-    "name": "org.apache.dubbo.rpc.filter.GenericImplFilter"
+    "name": "org.apache.dubbo.rpc.filter.GenericImplFilter",
+    "allPublicMethods": true,
+    "methods": [
+       {
+         "name": "<init>",
+         "parameterTypes": [
+           "org.apache.dubbo.rpc.model.ModuleModel"
+         ]
+       }
+     ]
   },
   {
     "name": "org.apache.dubbo.rpc.filter.TimeoutFilter",
@@ -2479,9 +2488,6 @@
   {
     "name": "org.apache.dubbo.rpc.filter.GenericFilter"
   },
-  {
-    "name": "org.apache.dubbo.rpc.filter.GenericImplFilter"
-  },
   {
     "name": "org.apache.dubbo.rpc.filter.TimeoutFilter"
   },
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/GenericImplFilter.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/GenericImplFilter.java
index 80e53ecb7f..f2b5041f93 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/GenericImplFilter.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/GenericImplFilter.java
@@ -16,6 +16,11 @@
  */
 package org.apache.dubbo.rpc.filter;
 
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
+
 import org.apache.dubbo.common.beanutil.JavaBeanAccessor;
 import org.apache.dubbo.common.beanutil.JavaBeanDescriptor;
 import org.apache.dubbo.common.beanutil.JavaBeanSerializeUtil;
@@ -23,6 +28,7 @@ import org.apache.dubbo.common.constants.CommonConstants;
 import org.apache.dubbo.common.extension.Activate;
 import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
 import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.DefaultSerializeClassChecker;
 import org.apache.dubbo.common.utils.PojoUtils;
 import org.apache.dubbo.common.utils.ReflectUtils;
 import org.apache.dubbo.rpc.Constants;
@@ -32,15 +38,11 @@ import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.Result;
 import org.apache.dubbo.rpc.RpcException;
 import org.apache.dubbo.rpc.RpcInvocation;
+import org.apache.dubbo.rpc.model.ModuleModel;
 import org.apache.dubbo.rpc.service.GenericService;
 import org.apache.dubbo.rpc.support.ProtocolUtils;
 import org.apache.dubbo.rpc.support.RpcUtils;
 
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.Type;
-
 import static org.apache.dubbo.common.constants.CommonConstants.$INVOKE;
 import static org.apache.dubbo.common.constants.CommonConstants.$INVOKE_ASYNC;
 import static org.apache.dubbo.common.constants.CommonConstants.GENERIC_PARAMETER_DESC;
@@ -59,6 +61,12 @@ public class GenericImplFilter implements Filter, Filter.Listener {
 
     private static final String GENERIC_IMPL_MARKER = "GENERIC_IMPL";
 
+    private final ModuleModel moduleModel;
+
+    public GenericImplFilter(ModuleModel moduleModel) {
+        this.moduleModel = moduleModel;
+    }
+
     @Override
     public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
         String generic = invoker.getUrl().getParameter(GENERIC_KEY);
@@ -172,7 +180,9 @@ public class GenericImplFilter implements Filter, Filter.Listener {
                 com.alibaba.dubbo.rpc.service.GenericException exception = (com.alibaba.dubbo.rpc.service.GenericException) appResponse.getException();
                 try {
                     String className = exception.getExceptionClass();
-                    Class<?> clazz = ReflectUtils.forName(className);
+                    DefaultSerializeClassChecker classChecker = moduleModel.getApplicationModel()
+                        .getFrameworkModel().getBeanFactory().getBean(DefaultSerializeClassChecker.class);
+                    Class<?> clazz = classChecker.loadClass(Thread.currentThread().getContextClassLoader(), className);
                     Throwable targetException = null;
                     Throwable lastException = null;
                     try {
diff --git a/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/filter/GenericImplFilterTest.java b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/filter/GenericImplFilterTest.java
index e8d92245c8..56e6a5d1c5 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/filter/GenericImplFilterTest.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/filter/GenericImplFilterTest.java
@@ -16,6 +16,10 @@
  */
 package org.apache.dubbo.rpc.filter;
 
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.rpc.AppResponse;
 import org.apache.dubbo.rpc.AsyncRpcResult;
@@ -23,18 +27,15 @@ import org.apache.dubbo.rpc.Invocation;
 import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.Result;
 import org.apache.dubbo.rpc.RpcInvocation;
+import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.service.GenericService;
 import org.apache.dubbo.rpc.support.DemoService;
 import org.apache.dubbo.rpc.support.Person;
-
-import com.alibaba.dubbo.rpc.service.GenericException;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 
-import java.lang.reflect.Method;
-import java.util.HashMap;
-import java.util.Map;
+import com.alibaba.dubbo.rpc.service.GenericException;
 
 import static org.apache.dubbo.common.constants.CommonConstants.$INVOKE;
 import static org.apache.dubbo.rpc.Constants.GENERIC_KEY;
@@ -43,7 +44,7 @@ import static org.mockito.Mockito.when;
 
 class GenericImplFilterTest {
 
-    private GenericImplFilter genericImplFilter = new GenericImplFilter();
+    private GenericImplFilter genericImplFilter = new GenericImplFilter(ApplicationModel.defaultModel().getDefaultModule());
 
     @Test
     void testInvoke() throws Exception {