From c8f7269e41b6f509cfb14a45334521bd15a0944c Mon Sep 17 00:00:00 2001 From: huazhongming Date: Tue, 12 Dec 2023 17:54:32 +0800 Subject: [PATCH] Fix method annotation compile failed in native (#13490) Signed-off-by: crazyhzm --- .../apache/dubbo/config/AbstractInterfaceConfig.java | 11 +++++++++++ .../java/org/apache/dubbo/config/MethodConfig.java | 3 +-- .../config/spring/aot/AotWithSpringDetector.java | 6 ++++++ .../annotation/ServiceAnnotationPostProcessor.java | 9 ++++++++- 4 files changed, 26 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 53b3eadb35..fe25f46f1e 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 @@ -27,6 +27,7 @@ import org.apache.dubbo.common.utils.Assert; import org.apache.dubbo.common.utils.ClassUtils; import org.apache.dubbo.common.utils.CollectionUtils; import org.apache.dubbo.common.utils.ConfigUtils; +import org.apache.dubbo.common.utils.JsonUtils; import org.apache.dubbo.common.utils.ReflectUtils; import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.config.support.Parameter; @@ -758,6 +759,16 @@ public abstract class AbstractInterfaceConfig extends AbstractMethodConfig { this.methods = (methods != null) ? new ArrayList<>(methods) : null; } + public void setMethodsJson(List methodsJson) { + if (methodsJson != null) { + this.methods = new ArrayList<>(); + methodsJson.forEach( + (methodConfigJson) -> methods.add(JsonUtils.toJavaObject(methodConfigJson, MethodConfig.class))); + } else { + this.methods = null; + } + } + public void addMethod(MethodConfig methodConfig) { if (this.methods == null) { this.methods = new ArrayList<>(); diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/MethodConfig.java b/dubbo-common/src/main/java/org/apache/dubbo/config/MethodConfig.java index 000b447cac..7cdc83db9b 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/config/MethodConfig.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/config/MethodConfig.java @@ -217,9 +217,8 @@ public class MethodConfig extends AbstractMethodConfig { List prefixes = new ArrayList<>(); prefixes.add(parentPrefix + "." + this.getName()); return prefixes; - } else { - throw new IllegalStateException("The parent prefix of MethodConfig is null"); } + return null; } @Override diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/aot/AotWithSpringDetector.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/aot/AotWithSpringDetector.java index 3bda2719d0..1ee9ef3f2e 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/aot/AotWithSpringDetector.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/aot/AotWithSpringDetector.java @@ -30,6 +30,8 @@ public abstract class AotWithSpringDetector { */ public static final String AOT_ENABLED = "spring.aot.enabled"; + private static final String AOT_PROCESSING = "spring.aot.processing"; + /** * Determine whether AOT optimizations must be considered at runtime. This * is mandatory in a native image but can be triggered on the JVM using @@ -40,4 +42,8 @@ public abstract class AotWithSpringDetector { public static boolean useGeneratedArtifacts() { return (NativeDetector.inNativeImage() || SpringProperties.getFlag(AOT_ENABLED)); } + + public static boolean isAotProcessing() { + return (NativeDetector.inNativeImage() || SpringProperties.getFlag(AOT_PROCESSING)); + } } diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationPostProcessor.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationPostProcessor.java index ddfc9424da..0c0af139cd 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationPostProcessor.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationPostProcessor.java @@ -21,6 +21,7 @@ import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.utils.AnnotationUtils; import org.apache.dubbo.common.utils.ClassUtils; +import org.apache.dubbo.common.utils.JsonUtils; import org.apache.dubbo.common.utils.ReflectUtils; import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.config.Constants; @@ -486,7 +487,13 @@ public class ServiceAnnotationPostProcessor // Add methods parameters List methodConfigs = convertMethodConfigs(serviceAnnotationAttributes.get("methods")); if (!methodConfigs.isEmpty()) { - builder.addPropertyValue("methods", methodConfigs); + if (AotWithSpringDetector.isAotProcessing()) { + List methodsJson = new ArrayList<>(); + methodConfigs.forEach(methodConfig -> methodsJson.add(JsonUtils.toJson(methodConfig))); + builder.addPropertyValue("methodsJson", methodsJson); + } else { + builder.addPropertyValue("methods", methodConfigs); + } } // convert provider to providerIds