This is an automated email from the ASF dual-hosted git repository. liujun pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git
The following commit(s) were added to refs/heads/master by this push: new 08d5f15 Merge pull request #3639, Add equivalent annotation support for MethodConfig. 08d5f15 is described below commit 08d5f15a4cb5ea014eb817b1b1106c8fae449998 Author: cvictory <shenglic...@gmail.com> AuthorDate: Thu Mar 14 16:27:11 2019 +0800 Merge pull request #3639, Add equivalent annotation support for MethodConfig. Fixes #2045 --- .../org/apache/dubbo/config/ArgumentConfig.java | 12 +++- .../java/org/apache/dubbo/config/MethodConfig.java | 45 +++++++++++++- .../org/apache/dubbo/config/ReferenceConfig.java | 1 + .../org/apache/dubbo/config/ServiceConfig.java | 1 + .../apache/dubbo/config/annotation/Argument.java} | 37 +++++++----- .../org/apache/dubbo/config/annotation/Method.java | 69 ++++++++++++++++++++++ .../apache/dubbo/config/annotation/Reference.java | 6 ++ .../apache/dubbo/config/annotation/Service.java | 6 ++ .../apache/dubbo/config/AbstractConfigTest.java | 19 ++++++ .../org/apache/dubbo/config/MethodConfigTest.java | 54 ++++++++++++++++- .../apache/dubbo/config/ReferenceConfigTest.java | 31 ++++++++++ .../factory/annotation/ReferenceBeanBuilder.java | 13 ++++ .../ServiceAnnotationBeanPostProcessor.java | 8 ++- .../dubbo/config/spring/util/AnnotationUtils.java | 13 +++- .../annotation/consumer/AnnotationAction.java | 5 +- 15 files changed, 298 insertions(+), 22 deletions(-) diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ArgumentConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ArgumentConfig.java index 61db01f..74d906c 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ArgumentConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ArgumentConfig.java @@ -16,6 +16,7 @@ */ package org.apache.dubbo.config; +import org.apache.dubbo.config.annotation.Argument; import org.apache.dubbo.config.support.Parameter; import java.io.Serializable; @@ -44,6 +45,15 @@ public class ArgumentConfig implements Serializable { */ private Boolean callback; + public ArgumentConfig() { + } + + public ArgumentConfig(Argument argument) { + this.index = argument.index(); + this.type = argument.type(); + this.callback = argument.callback(); + } + @Parameter(excluded = true) public Integer getIndex() { return index; @@ -70,4 +80,4 @@ public class ArgumentConfig implements Serializable { return callback; } -} \ No newline at end of file +} diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/MethodConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/MethodConfig.java index d65c665..c9478d4 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/MethodConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/MethodConfig.java @@ -18,8 +18,11 @@ package org.apache.dubbo.config; import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.utils.StringUtils; +import org.apache.dubbo.config.annotation.Method; import org.apache.dubbo.config.support.Parameter; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -117,6 +120,46 @@ public class MethodConfig extends AbstractMethodConfig { return name; } + public MethodConfig() { + } + + public MethodConfig(Method method) { + appendAnnotation(Method.class, method); + + this.setReturn(method.isReturn()); + + if(!"".equals(method.oninvoke())){ + this.setOninvoke(method.oninvoke()); + } + if(!"".equals(method.onreturn())){ + this.setOnreturn(method.onreturn()); + } + if(!"".equals(method.onthrow())){ + this.setOnthrow(method.onthrow()); + } + + if (method.arguments() != null && method.arguments().length != 0) { + List<ArgumentConfig> argumentConfigs = new ArrayList<ArgumentConfig>(method.arguments().length); + this.setArguments(argumentConfigs); + for (int i = 0; i < method.arguments().length; i++) { + ArgumentConfig argumentConfig = new ArgumentConfig(method.arguments()[i]); + argumentConfigs.add(argumentConfig); + } + } + } + + public static List<MethodConfig> constructMethodConfig(Method[] methods) { + if (methods != null && methods.length != 0) { + List<MethodConfig> methodConfigs = new ArrayList<MethodConfig>(methods.length); + for (int i = 0; i < methods.length; i++) { + MethodConfig methodConfig = new MethodConfig(methods[i]); + methodConfigs.add(methodConfig); + } + return methodConfigs; + } + return Collections.emptyList(); + } + public void setName(String name) { checkMethodName("name", name); this.name = name; @@ -279,4 +322,4 @@ public class MethodConfig extends AbstractMethodConfig { + (StringUtils.isEmpty(serviceId) ? "" : ("." + serviceId)) + "." + getName(); } -} \ No newline at end of file +} diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java index a7bbf13..b2d5fcd 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java @@ -178,6 +178,7 @@ public class ReferenceConfig<T> extends AbstractReferenceConfig { public ReferenceConfig(Reference reference) { appendAnnotation(Reference.class, reference); + setMethods(MethodConfig.constructMethodConfig(reference.methods())); } public URL toUrl() { diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java index 7cca8cc..2c640ca 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java @@ -169,6 +169,7 @@ public class ServiceConfig<T> extends AbstractServiceConfig { public ServiceConfig(Service service) { appendAnnotation(Service.class, service); + setMethods(MethodConfig.constructMethodConfig(service.methods())); } @Deprecated diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/annotation/consumer/AnnotationAction.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Argument.java similarity index 56% copy from dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/annotation/consumer/AnnotationAction.java copy to dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Argument.java index 35d94fe..6a0da8e 100644 --- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/annotation/consumer/AnnotationAction.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Argument.java @@ -14,24 +14,31 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.dubbo.config.spring.annotation.consumer; +package org.apache.dubbo.config.annotation; -import org.apache.dubbo.config.annotation.Reference; -import org.apache.dubbo.config.spring.api.DemoService; - -import org.springframework.stereotype.Controller; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; /** - * AnnotationAction + * @since 2.6.5 + * + * 2018/9/29 */ -@Controller("annotationAction") -public class AnnotationAction { - - @Reference(version = "1.2") - private DemoService demoService; +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.ANNOTATION_TYPE}) +@Inherited +public @interface Argument { + //argument: index -1 represents not set + int index() default -1; - public String doSayName(String name) { - return demoService.sayName(name); - } + //argument type + String type() default ""; -} \ No newline at end of file + //callback interface + boolean callback() default false; +} diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Method.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Method.java new file mode 100644 index 0000000..0cdc97c --- /dev/null +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Method.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.dubbo.config.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @since 2.6.5 + * * + * * 2018/9/29 + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.ANNOTATION_TYPE}) +@Inherited +public @interface Method { + String name(); + + int timeout() default -1; + + int retries() default -1; + + String loadbalance() default ""; + + boolean async() default false; + + boolean sent() default true; + + int actives() default 0; + + int executes() default 0; + + boolean deprecated() default false; + + boolean sticky() default false; + + boolean isReturn() default true; + + String oninvoke() default ""; + + String onreturn() default ""; + + String onthrow() default ""; + + String cache() default ""; + + String validation() default ""; + + Argument[] arguments() default {}; +} diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Reference.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Reference.java index 9aaea67..bdbbd35 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Reference.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Reference.java @@ -256,4 +256,10 @@ public @interface Reference { * Protocol spring bean names */ String protocol() default ""; + + /** + * methods support + * @return + */ + Method[] methods() default {}; } diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Service.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Service.java index 6f956f5..2e6f9b6 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Service.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Service.java @@ -268,4 +268,10 @@ public @interface Service { * Service tag name */ String tag() default ""; + + /** + * methods support + * @return + */ + Method[] methods() default {}; } diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java index d95b2de..2d40cc3 100644 --- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java +++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java @@ -468,6 +468,12 @@ public class AbstractConfigTest { } @Retention(RetentionPolicy.RUNTIME) + @Target({ElementType.ANNOTATION_TYPE}) + public @interface ConfigField { + String value() default ""; + } + + @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE}) public @interface Config { Class<?> interfaceClass() default void.class; @@ -479,6 +485,10 @@ public class AbstractConfigTest { String[] listener() default {}; String[] parameters() default {}; + + ConfigField[] configFields() default {}; + + ConfigField configField() default @ConfigField; } private static class OverrideConfig extends AbstractInterfaceConfig { @@ -735,6 +745,7 @@ public class AbstractConfigTest { private String filter; private String listener; private Map<String, String> parameters; + private String[] configFields; public Class getInterface() { return interfaceClass; @@ -767,5 +778,13 @@ public class AbstractConfigTest { public void setParameters(Map<String, String> parameters) { this.parameters = parameters; } + + public String[] getConfigFields() { + return configFields; + } + + public void setConfigFields(String[] configFields) { + this.configFields = configFields; + } } } diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/MethodConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/MethodConfigTest.java index 862c999..1d976d7 100644 --- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/MethodConfigTest.java +++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/MethodConfigTest.java @@ -18,23 +18,75 @@ package org.apache.dubbo.config; import org.apache.dubbo.common.Constants; +import org.apache.dubbo.config.annotation.Argument; +import org.apache.dubbo.config.annotation.Method; +import org.apache.dubbo.config.annotation.Reference; import org.hamcrest.Matchers; import org.junit.jupiter.api.Test; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasEntry; import static org.hamcrest.Matchers.hasKey; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; -import static org.hamcrest.MatcherAssert.assertThat; public class MethodConfigTest { + private static final String METHOD_NAME = "sayHello"; + private static final int TIMEOUT = 1300; + private static final int RETRIES = 4; + private static final String LOADBALANCE = "random"; + private static final boolean ASYNC = true; + private static final int ACTIVES = 3; + private static final int EXECUTES = 5; + private static final boolean DEPERECATED = true; + private static final boolean STICKY = true; + private static final String ONINVOKE = "i"; + private static final String ONTHROW = "t"; + private static final String ONRETURN = "r"; + private static final String CACHE = "c"; + private static final String VALIDATION = "v"; + private static final int ARGUMENTS_INDEX = 24; + private static final boolean ARGUMENTS_CALLBACK = true; + private static final String ARGUMENTS_TYPE = "sss"; + + @Reference(methods = {@Method(name = METHOD_NAME, timeout = TIMEOUT, retries = RETRIES, loadbalance = LOADBALANCE, async = ASYNC, + actives = ACTIVES, executes = EXECUTES, deprecated = DEPERECATED, sticky = STICKY, oninvoke = ONINVOKE, onthrow = ONTHROW, onreturn = ONRETURN, cache = CACHE, validation = VALIDATION, + arguments = {@Argument(index = ARGUMENTS_INDEX, callback = ARGUMENTS_CALLBACK, type = ARGUMENTS_TYPE)})}) + private String testField; + + @Test + public void testStaticConstructor() throws NoSuchFieldException { + Method[] methods = this.getClass().getDeclaredField("testField").getAnnotation(Reference.class).methods(); + List<MethodConfig> methodConfigs = MethodConfig.constructMethodConfig(methods); + MethodConfig methodConfig = methodConfigs.get(0); + + assertThat(METHOD_NAME, equalTo(methodConfig.getName())); + assertThat(TIMEOUT, equalTo(methodConfig.getTimeout().intValue())); + assertThat(RETRIES, equalTo(methodConfig.getRetries().intValue())); + assertThat(LOADBALANCE, equalTo(methodConfig.getLoadbalance())); + assertThat(ASYNC, equalTo(methodConfig.isAsync())); + assertThat(ACTIVES, equalTo(methodConfig.getActives().intValue())); + assertThat(EXECUTES, equalTo(methodConfig.getExecutes().intValue())); + assertThat(DEPERECATED, equalTo(methodConfig.getDeprecated())); + assertThat(STICKY, equalTo(methodConfig.getSticky())); + assertThat(ONINVOKE, equalTo(methodConfig.getOninvoke())); + assertThat(ONTHROW, equalTo(methodConfig.getOnthrow())); + assertThat(ONRETURN, equalTo(methodConfig.getOnreturn())); + assertThat(CACHE, equalTo(methodConfig.getCache())); + assertThat(VALIDATION, equalTo(methodConfig.getValidation())); + assertThat(ARGUMENTS_INDEX, equalTo(methodConfig.getArguments().get(0).getIndex().intValue())); + assertThat(ARGUMENTS_CALLBACK, equalTo(methodConfig.getArguments().get(0).isCallback())); + assertThat(ARGUMENTS_TYPE, equalTo(methodConfig.getArguments().get(0).getType())); + } + @Test public void testName() throws Exception { MethodConfig method = new MethodConfig(); diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java index 7c0c759..8a5cf10 100644 --- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java +++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java @@ -17,6 +17,9 @@ package org.apache.dubbo.config; import org.apache.dubbo.common.Constants; +import org.apache.dubbo.config.annotation.Argument; +import org.apache.dubbo.config.annotation.Method; +import org.apache.dubbo.config.annotation.Reference; import org.apache.dubbo.config.api.DemoService; import org.apache.dubbo.config.context.ConfigManager; import org.apache.dubbo.config.provider.impl.DemoServiceImpl; @@ -124,4 +127,32 @@ public class ReferenceConfigTest { Assertions.assertNotNull(demoService); } + + @Test + public void testConstructWithReferenceAnnotation() throws NoSuchFieldException { + Reference reference = getClass().getDeclaredField("innerTest").getAnnotation(Reference.class); + ReferenceConfig referenceConfig = new ReferenceConfig(reference); + Assertions.assertTrue(referenceConfig.getMethods().size() == 1); + Assertions.assertEquals(((MethodConfig) referenceConfig.getMethods().get(0)).getName(), "sayHello"); + Assertions.assertTrue(((MethodConfig) referenceConfig.getMethods().get(0)).getTimeout() == 1300); + Assertions.assertTrue(((MethodConfig) referenceConfig.getMethods().get(0)).getRetries() == 4); + Assertions.assertEquals(((MethodConfig) referenceConfig.getMethods().get(0)).getLoadbalance(), "random"); + Assertions.assertTrue(((MethodConfig) referenceConfig.getMethods().get(0)).getActives() == 3); + Assertions.assertTrue(((MethodConfig) referenceConfig.getMethods().get(0)).getExecutes() == 5); + Assertions.assertTrue(((MethodConfig) referenceConfig.getMethods().get(0)).isAsync()); + Assertions.assertEquals(((MethodConfig) referenceConfig.getMethods().get(0)).getOninvoke(), "i"); + Assertions.assertEquals(((MethodConfig) referenceConfig.getMethods().get(0)).getOnreturn(), "r"); + Assertions.assertEquals(((MethodConfig) referenceConfig.getMethods().get(0)).getOnthrow(), "t"); + Assertions.assertEquals(((MethodConfig) referenceConfig.getMethods().get(0)).getCache(), "c"); + } + + + @Reference(methods = {@Method(name = "sayHello", timeout = 1300, retries = 4, loadbalance = "random", async = true, + actives = 3, executes = 5, deprecated = true, sticky = true, oninvoke = "i", onthrow = "t", onreturn = "r", cache = "c", validation = "v", + arguments = {@Argument(index = 24, callback = true, type = "sss")})}) + private InnerTest innerTest; + + private class InnerTest { + + } } diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilder.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilder.java index aff3ed2..d4aef6a 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilder.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilder.java @@ -18,6 +18,8 @@ package org.apache.dubbo.config.spring.beans.factory.annotation; import org.apache.dubbo.common.utils.CollectionUtils; import org.apache.dubbo.config.ConsumerConfig; +import org.apache.dubbo.config.MethodConfig; +import org.apache.dubbo.config.annotation.Method; import org.apache.dubbo.config.annotation.Reference; import org.apache.dubbo.config.spring.ReferenceBean; @@ -29,6 +31,7 @@ import org.springframework.util.StringUtils; import org.springframework.validation.DataBinder; import java.beans.PropertyEditorSupport; +import java.util.List; import java.util.Map; import static org.apache.dubbo.config.spring.util.BeanFactoryUtils.getOptionalBean; @@ -89,6 +92,14 @@ class ReferenceBeanBuilder extends AbstractAnnotationConfigBeanBuilder<Reference } + void configureMethodConfig(Reference reference, ReferenceBean<?> referenceBean){ + Method[] methods = reference.methods(); + List<MethodConfig> methodConfigs = MethodConfig.constructMethodConfig(methods); + if(!methodConfigs.isEmpty()){ + referenceBean.setMethods(methodConfigs); + } + } + @Override protected ReferenceBean doBuild() { return new ReferenceBean<Object>(); @@ -154,6 +165,8 @@ class ReferenceBeanBuilder extends AbstractAnnotationConfigBeanBuilder<Reference configureConsumerConfig(annotation, bean); + configureMethodConfig(annotation, bean); + bean.afterPropertiesSet(); } diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java index bc5339b..22fa704 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java @@ -18,6 +18,7 @@ package org.apache.dubbo.config.spring.beans.factory.annotation; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; +import org.apache.dubbo.config.MethodConfig; import org.apache.dubbo.config.annotation.Service; import org.apache.dubbo.config.spring.ServiceBean; import org.apache.dubbo.config.spring.context.annotation.DubboClassPathBeanDefinitionScanner; @@ -434,6 +435,11 @@ public class ServiceAnnotationBeanPostProcessor implements BeanDefinitionRegistr builder.addPropertyValue("protocols", protocolRuntimeBeanReferences); } + List<MethodConfig> methodConfigs = MethodConfig.constructMethodConfig(service.methods()); + if (!methodConfigs.isEmpty()) { + builder.addPropertyValue("methods", methodConfigs); + } + return builder.getBeanDefinition(); } @@ -484,4 +490,4 @@ public class ServiceAnnotationBeanPostProcessor implements BeanDefinitionRegistr this.classLoader = classLoader; } -} \ No newline at end of file +} diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/AnnotationUtils.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/AnnotationUtils.java index ed2a607..9832e10 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/AnnotationUtils.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/AnnotationUtils.java @@ -258,6 +258,17 @@ public class AnnotationUtils { continue; } + /** + * @since 2.7.1 + * ignore annotation member + */ + if (attributeValue.getClass().isAnnotation()){ + continue; + } + if (attributeValue.getClass().isArray() && attributeValue.getClass().getComponentType().isAnnotation()){ + continue; + } + if (attributeValue instanceof String) { attributeValue = resolvePlaceholders(valueOf(attributeValue), propertyResolver); } else if (attributeValue instanceof String[]) { @@ -281,4 +292,4 @@ public class AnnotationUtils { return resolvedValue; } -} \ No newline at end of file +} diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/annotation/consumer/AnnotationAction.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/annotation/consumer/AnnotationAction.java index 35d94fe..1e71f01 100644 --- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/annotation/consumer/AnnotationAction.java +++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/annotation/consumer/AnnotationAction.java @@ -16,6 +16,7 @@ */ package org.apache.dubbo.config.spring.annotation.consumer; +import org.apache.dubbo.config.annotation.Method; import org.apache.dubbo.config.annotation.Reference; import org.apache.dubbo.config.spring.api.DemoService; @@ -27,11 +28,11 @@ import org.springframework.stereotype.Controller; @Controller("annotationAction") public class AnnotationAction { - @Reference(version = "1.2") + @Reference(version = "1.2", methods = {@Method(name = "sayHello", timeout = 5000)}) private DemoService demoService; public String doSayName(String name) { return demoService.sayName(name); } -} \ No newline at end of file +}