From c44873e9b2e2a9ecb0459dce6e85cdfc829b2300 Mon Sep 17 00:00:00 2001 From: Albumen Kevin Date: Fri, 3 Feb 2023 11:49:33 +0800 Subject: [PATCH] Fix Class Check --- .../utils/DefaultSerializeClassChecker.java | 2 +- .../META-INF/native-image/reflect-config.json | 14 ++++++++---- .../dubbo/rpc/filter/GenericImplFilter.java | 22 ++++++++++++++----- .../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": "", + "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 {