From e6957454dc0d90718a9b25ebbbb174e4f3333db2 Mon Sep 17 00:00:00 2001 From: cvictory Date: Sun, 30 Sep 2018 11:47:50 +0800 Subject: [PATCH 1/7] support methodConfig and argementConfig. fix #2298 --- .../alibaba/dubbo/config/AbstractConfig.java | 8 ++- .../alibaba/dubbo/config/ArgumentConfig.java | 11 +++- .../alibaba/dubbo/config/MethodConfig.java | 33 +++++++++++- .../alibaba/dubbo/config/ReferenceConfig.java | 1 + .../alibaba/dubbo/config/ServiceConfig.java | 1 + .../dubbo/config/annotation/Argument.java | 26 ++++++++++ .../dubbo/config/annotation/Method.java | 52 +++++++++++++++++++ .../dubbo/config/annotation/Reference.java | 2 + .../dubbo/config/annotation/Service.java | 2 + .../annotation/ReferenceBeanBuilder.java | 14 +++++ .../ServiceAnnotationBeanPostProcessor.java | 10 +++- .../config/spring/util/AnnotationUtils.java | 9 ++++ .../annotation/AnnotationConsumer.java | 1 + .../annotation/AnnotationProvider.java | 1 + .../annotation/action/AnnotationAction.java | 3 +- 15 files changed, 169 insertions(+), 5 deletions(-) create mode 100644 dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Argument.java create mode 100644 dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Method.java diff --git a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/AbstractConfig.java b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/AbstractConfig.java index 782215debcc..37c7daab52e 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/AbstractConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/AbstractConfig.java @@ -423,7 +423,7 @@ protected void appendAnnotation(Class annotationClass, Object annotation) { } String setter = "set" + property.substring(0, 1).toUpperCase() + property.substring(1); Object value = method.invoke(annotation); - if (value != null && !value.equals(method.getDefaultValue())) { + if (!isAnnotationArray(method.getReturnType()) && value != null && !value.equals(method.getDefaultValue())) { Class parameterType = ReflectUtils.getBoxedClass(method.getReturnType()); if ("filter".equals(property) || "listener".equals(property)) { parameterType = String.class; @@ -445,6 +445,12 @@ protected void appendAnnotation(Class annotationClass, Object annotation) { } } } + boolean isAnnotationArray(Class target){ + if(target.isArray() && target.getComponentType().isAnnotation()){ + return true; + } + return false; + } @Override public String toString() { diff --git a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ArgumentConfig.java b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ArgumentConfig.java index e752726a0ca..b1363a7e870 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ArgumentConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ArgumentConfig.java @@ -16,6 +16,7 @@ */ package com.alibaba.dubbo.config; +import com.alibaba.dubbo.config.annotation.Argument; import com.alibaba.dubbo.config.support.Parameter; import java.io.Serializable; @@ -36,6 +37,14 @@ public class ArgumentConfig implements Serializable { //callback interface 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; @@ -62,4 +71,4 @@ public Boolean isCallback() { return callback; } -} \ No newline at end of file +} diff --git a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/MethodConfig.java b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/MethodConfig.java index 28230fd9e49..e665a8a3c72 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/MethodConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/MethodConfig.java @@ -17,8 +17,11 @@ package com.alibaba.dubbo.config; import com.alibaba.dubbo.common.Constants; +import com.alibaba.dubbo.config.annotation.Method; import com.alibaba.dubbo.config.support.Parameter; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -74,6 +77,34 @@ public class MethodConfig extends AbstractMethodConfig { private List arguments; + public MethodConfig() { + } + + public MethodConfig(Method method) { + appendAnnotation(Method.class, method); + this.setReturn(method.isReturn()); + if (method.arguments() != null && method.arguments().length != 0) { + List argumentConfigs = new ArrayList(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 constructMethodConfig(Method[] methods) { + if (methods != null && methods.length != 0) { + List methodConfigs = new ArrayList(methods.length); + for (int i = 0; i < methods.length; i++) { + MethodConfig methodConfig = new MethodConfig(methods[i]); + methodConfigs.add(methodConfig); + } + return methodConfigs; + } + return Collections.emptyList(); + } + @Parameter(excluded = true) public String getName() { return name; @@ -211,4 +242,4 @@ public void setReturn(Boolean isReturn) { this.isReturn = isReturn; } -} \ No newline at end of file +} diff --git a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ReferenceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ReferenceConfig.java index c6c75b16c68..0d72b1e95d9 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ReferenceConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ReferenceConfig.java @@ -112,6 +112,7 @@ public ReferenceConfig() { public ReferenceConfig(Reference reference) { appendAnnotation(Reference.class, reference); + MethodConfig.constructMethodConfig(reference.methods()); } private static void checkAndConvertImplicitConfig(MethodConfig method, Map map, Map attributes) { diff --git a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ServiceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ServiceConfig.java index ec6dcd982c8..f3d297fb76a 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ServiceConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ServiceConfig.java @@ -101,6 +101,7 @@ public ServiceConfig() { public ServiceConfig(Service service) { appendAnnotation(Service.class, service); + MethodConfig.constructMethodConfig(service.methods()); } @Deprecated diff --git a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Argument.java b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Argument.java new file mode 100644 index 00000000000..ae5c1123e3e --- /dev/null +++ b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Argument.java @@ -0,0 +1,26 @@ +package com.alibaba.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; + +/** + * @author cvictory ON 2018/9/29 + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.ANNOTATION_TYPE}) +@Inherited +public @interface Argument { + //argument: index -1 represents not set + int index() default -1; + + //argument type + String type() default ""; + + //callback interface + boolean callback() default false; +} diff --git a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Method.java b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Method.java new file mode 100644 index 00000000000..963e0b1028f --- /dev/null +++ b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Method.java @@ -0,0 +1,52 @@ +package com.alibaba.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; + +/** + * @author cvictory ON 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 ""; + + boolean validation() default false; + + Argument[] arguments() default {}; +} diff --git a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Reference.java b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Reference.java index c043cb3bd3d..727cb22e5ff 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Reference.java +++ b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Reference.java @@ -112,4 +112,6 @@ String[] registry() default {}; + Method[] methods() default {}; + } diff --git a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Service.java b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Service.java index 322bce37a09..67a38faa464 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Service.java +++ b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Service.java @@ -120,4 +120,6 @@ String[] registry() default {}; + Method[] methods() default {}; + } diff --git a/dubbo-config/dubbo-config-spring/src/main/java/com/alibaba/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilder.java b/dubbo-config/dubbo-config-spring/src/main/java/com/alibaba/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilder.java index 5d9418fbc8a..41b769cd423 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/com/alibaba/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilder.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/com/alibaba/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilder.java @@ -17,6 +17,8 @@ package com.alibaba.dubbo.config.spring.beans.factory.annotation; import com.alibaba.dubbo.config.ConsumerConfig; +import com.alibaba.dubbo.config.MethodConfig; +import com.alibaba.dubbo.config.annotation.Method; import com.alibaba.dubbo.config.annotation.Reference; import com.alibaba.dubbo.config.spring.ReferenceBean; import com.alibaba.dubbo.config.spring.convert.converter.StringArrayToMapConverter; @@ -29,6 +31,8 @@ import org.springframework.util.StringUtils; import org.springframework.validation.DataBinder; +import java.util.List; + import static com.alibaba.dubbo.config.spring.util.BeanFactoryUtils.getOptionalBean; import static com.alibaba.dubbo.config.spring.util.ObjectUtils.of; @@ -84,6 +88,14 @@ private void configureConsumerConfig(Reference reference, ReferenceBean refer } + private void configureMethodConfig(Reference reference, ReferenceBean referenceBean){ + Method[] methods = reference.methods(); + List methodConfigs = MethodConfig.constructMethodConfig(methods); + if(!methodConfigs.isEmpty()){ + referenceBean.setMethods(methodConfigs); + } + } + @Override protected ReferenceBean doBuild() { return new ReferenceBean(); @@ -139,6 +151,8 @@ protected void postConfigureBean(Reference annotation, ReferenceBean bean) throw configureConsumerConfig(annotation, bean); + configureMethodConfig(annotation, bean); + bean.afterPropertiesSet(); } diff --git a/dubbo-config/dubbo-config-spring/src/main/java/com/alibaba/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java b/dubbo-config/dubbo-config-spring/src/main/java/com/alibaba/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java index 35604650906..2335b8467f1 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/com/alibaba/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/com/alibaba/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java @@ -18,6 +18,8 @@ import com.alibaba.dubbo.common.logger.Logger; import com.alibaba.dubbo.common.logger.LoggerFactory; +import com.alibaba.dubbo.config.MethodConfig; +import com.alibaba.dubbo.config.annotation.Method; import com.alibaba.dubbo.config.annotation.Service; import com.alibaba.dubbo.config.spring.ServiceBean; import com.alibaba.dubbo.config.spring.context.annotation.DubboClassPathBeanDefinitionScanner; @@ -450,6 +452,12 @@ private AbstractBeanDefinition buildServiceBeanDefinition(Service service, Class builder.addPropertyValue("protocols", protocolRuntimeBeanReferences); } + Method[] methods = service.methods(); + List methodConfigs = MethodConfig.constructMethodConfig(methods); + if(!methodConfigs.isEmpty()){ + builder.addPropertyValue("methods", methodConfigs); + } + return builder.getBeanDefinition(); } @@ -500,4 +508,4 @@ public void setBeanClassLoader(ClassLoader classLoader) { this.classLoader = classLoader; } -} \ No newline at end of file +} diff --git a/dubbo-config/dubbo-config-spring/src/main/java/com/alibaba/dubbo/config/spring/util/AnnotationUtils.java b/dubbo-config/dubbo-config-spring/src/main/java/com/alibaba/dubbo/config/spring/util/AnnotationUtils.java index aa15e567eb0..9e35fa65212 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/com/alibaba/dubbo/config/spring/util/AnnotationUtils.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/com/alibaba/dubbo/config/spring/util/AnnotationUtils.java @@ -72,6 +72,15 @@ public static Map getAttributes(Annotation annotation, PropertyR if (ignoreAttributeNamesSet.contains(attributeName)) { continue; } + /** + * @since 2.6.5 + */ + if (attributeValue.getClass().isAnnotation()){ + continue; + } + if (attributeValue.getClass().isArray() && attributeValue.getClass().getComponentType().isAnnotation()){ + continue; + } if (requiredResolve && attributeValue instanceof String) { // Resolve Placeholder String resolvedValue = propertyResolver.resolvePlaceholders(valueOf(attributeValue)); diff --git a/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/AnnotationConsumer.java b/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/AnnotationConsumer.java index 84a1df71789..01fde45085f 100644 --- a/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/AnnotationConsumer.java +++ b/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/AnnotationConsumer.java @@ -30,6 +30,7 @@ public class AnnotationConsumer { public static void main(String[] args) throws Exception { + System.setProperty("java.net.preferIPv4Stack", "true"); AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConsumerConfiguration.class); context.start(); final AnnotationAction annotationAction = (AnnotationAction) context.getBean("annotationAction"); diff --git a/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/AnnotationProvider.java b/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/AnnotationProvider.java index e7059252050..a89664df5d3 100644 --- a/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/AnnotationProvider.java +++ b/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/AnnotationProvider.java @@ -30,6 +30,7 @@ public class AnnotationProvider { public static void main(String[] args) throws Exception { + System.setProperty("java.net.preferIPv4Stack", "true"); AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ProviderConfiguration.class); context.start(); System.in.read(); diff --git a/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/action/AnnotationAction.java b/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/action/AnnotationAction.java index 7b401923a1a..9619c14c0fb 100644 --- a/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/action/AnnotationAction.java +++ b/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/action/AnnotationAction.java @@ -16,6 +16,7 @@ */ package com.alibaba.dubbo.examples.annotation.action; +import com.alibaba.dubbo.config.annotation.Method; import com.alibaba.dubbo.config.annotation.Reference; import com.alibaba.dubbo.examples.annotation.api.AnnotationService; @@ -27,7 +28,7 @@ @Component("annotationAction") public class AnnotationAction { - @Reference + @Reference(methods = {@Method(name = "sayHello", timeout = 1000)}) private AnnotationService annotationService; public String doSayHello(String name) { From bf29a82a035ec9cc1803fab029acf81fc25f1d86 Mon Sep 17 00:00:00 2001 From: cvictory Date: Sun, 30 Sep 2018 15:28:48 +0800 Subject: [PATCH 2/7] unit test --- .../alibaba/dubbo/config/MethodConfig.java | 3 ++ .../alibaba/dubbo/config/ReferenceConfig.java | 2 +- .../alibaba/dubbo/config/ServiceConfig.java | 2 +- .../dubbo/config/AbstractConfigTest.java | 19 +++++++++++ .../dubbo/config/ArgumentConfigTest.java | 1 + .../dubbo/config/ReferenceConfigTest.java | 33 ++++++++++++++++++- .../config/spring/util/AnnotationUtils.java | 1 + 7 files changed, 58 insertions(+), 3 deletions(-) diff --git a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/MethodConfig.java b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/MethodConfig.java index e665a8a3c72..7fa7140e3e2 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/MethodConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/MethodConfig.java @@ -83,6 +83,9 @@ public MethodConfig() { public MethodConfig(Method method) { appendAnnotation(Method.class, method); this.setReturn(method.isReturn()); + this.setOninvoke(method.oninvoke()); + this.setOnreturn(method.onreturn()); + this.setOnthrow(method.onthrow()); if (method.arguments() != null && method.arguments().length != 0) { List argumentConfigs = new ArrayList(method.arguments().length); this.setArguments(argumentConfigs); diff --git a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ReferenceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ReferenceConfig.java index 0d72b1e95d9..85fb85ae328 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ReferenceConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ReferenceConfig.java @@ -112,7 +112,7 @@ public ReferenceConfig() { public ReferenceConfig(Reference reference) { appendAnnotation(Reference.class, reference); - MethodConfig.constructMethodConfig(reference.methods()); + setMethods(MethodConfig.constructMethodConfig(reference.methods())); } private static void checkAndConvertImplicitConfig(MethodConfig method, Map map, Map attributes) { diff --git a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ServiceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ServiceConfig.java index f3d297fb76a..114290f2b9e 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ServiceConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ServiceConfig.java @@ -101,7 +101,7 @@ public ServiceConfig() { public ServiceConfig(Service service) { appendAnnotation(Service.class, service); - MethodConfig.constructMethodConfig(service.methods()); + setMethods(MethodConfig.constructMethodConfig(service.methods())); } @Deprecated diff --git a/dubbo-config/dubbo-config-api/src/test/java/com/alibaba/dubbo/config/AbstractConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/com/alibaba/dubbo/config/AbstractConfigTest.java index 765c429b8a3..c0f5a6b3d52 100644 --- a/dubbo-config/dubbo-config-api/src/test/java/com/alibaba/dubbo/config/AbstractConfigTest.java +++ b/dubbo-config/dubbo-config-api/src/test/java/com/alibaba/dubbo/config/AbstractConfigTest.java @@ -474,6 +474,16 @@ public void setFlag(byte flag) { String[] listener() default {}; String[] parameters() default {}; + + ConfigField[] configFields() default {}; + + ConfigField configField() default @ConfigField; + } + + @Retention(RetentionPolicy.RUNTIME) + @Target({ElementType.ANNOTATION_TYPE}) + public @interface ConfigField { + String value() default ""; } private static class AnnotationConfig extends AbstractConfig { @@ -481,6 +491,7 @@ private static class AnnotationConfig extends AbstractConfig { private String filter; private String listener; private Map parameters; + private String[] configFields; public Class getInterface() { return interfaceClass; @@ -513,5 +524,13 @@ public Map getParameters() { public void setParameters(Map 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/com/alibaba/dubbo/config/ArgumentConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/com/alibaba/dubbo/config/ArgumentConfigTest.java index 4e1276f3a51..3a6bc09545b 100644 --- a/dubbo-config/dubbo-config-api/src/test/java/com/alibaba/dubbo/config/ArgumentConfigTest.java +++ b/dubbo-config/dubbo-config-api/src/test/java/com/alibaba/dubbo/config/ArgumentConfigTest.java @@ -17,6 +17,7 @@ package com.alibaba.dubbo.config; +import com.alibaba.dubbo.config.annotation.Argument; import org.junit.Test; import java.util.HashMap; diff --git a/dubbo-config/dubbo-config-api/src/test/java/com/alibaba/dubbo/config/ReferenceConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/com/alibaba/dubbo/config/ReferenceConfigTest.java index 888dc017cc7..1c4552b18ee 100644 --- a/dubbo-config/dubbo-config-api/src/test/java/com/alibaba/dubbo/config/ReferenceConfigTest.java +++ b/dubbo-config/dubbo-config-api/src/test/java/com/alibaba/dubbo/config/ReferenceConfigTest.java @@ -17,6 +17,9 @@ package com.alibaba.dubbo.config; import com.alibaba.dubbo.common.Constants; +import com.alibaba.dubbo.config.annotation.Argument; +import com.alibaba.dubbo.config.annotation.Method; +import com.alibaba.dubbo.config.annotation.Reference; import com.alibaba.dubbo.config.api.DemoService; import com.alibaba.dubbo.config.provider.impl.DemoServiceImpl; @@ -60,4 +63,32 @@ public void testInjvm() throws Exception { } } -} \ No newline at end of file + @Test + public void testConstructWithReferenceAnnotation() throws NoSuchFieldException { + Reference reference = getClass().getDeclaredField("innerTest").getAnnotation(Reference.class); + ReferenceConfig referenceConfig = new ReferenceConfig(reference); + Assert.assertTrue(referenceConfig.getMethods().size() == 1); + Assert.assertEquals(((MethodConfig) referenceConfig.getMethods().get(0)).getName(), "sayHello"); + Assert.assertTrue(((MethodConfig) referenceConfig.getMethods().get(0)).getTimeout() == 1300); + Assert.assertTrue(((MethodConfig) referenceConfig.getMethods().get(0)).getRetries() == 4); + Assert.assertEquals(((MethodConfig) referenceConfig.getMethods().get(0)).getLoadbalance(), "random"); + Assert.assertTrue(((MethodConfig) referenceConfig.getMethods().get(0)).getActives() == 3); + Assert.assertTrue(((MethodConfig) referenceConfig.getMethods().get(0)).getExecutes() == 5); + Assert.assertTrue(((MethodConfig) referenceConfig.getMethods().get(0)).isAsync()); + Assert.assertEquals(((MethodConfig) referenceConfig.getMethods().get(0)).getOninvoke(), "i"); + Assert.assertEquals(((MethodConfig) referenceConfig.getMethods().get(0)).getOnreturn(), "r"); + Assert.assertEquals(((MethodConfig) referenceConfig.getMethods().get(0)).getOnthrow(), "t"); + Assert.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 = true, + 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/com/alibaba/dubbo/config/spring/util/AnnotationUtils.java b/dubbo-config/dubbo-config-spring/src/main/java/com/alibaba/dubbo/config/spring/util/AnnotationUtils.java index 9e35fa65212..b83a5042f30 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/com/alibaba/dubbo/config/spring/util/AnnotationUtils.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/com/alibaba/dubbo/config/spring/util/AnnotationUtils.java @@ -74,6 +74,7 @@ public static Map getAttributes(Annotation annotation, PropertyR } /** * @since 2.6.5 + * ignore annotation member */ if (attributeValue.getClass().isAnnotation()){ continue; From ab14d6a1e545222d29b3eeaf42b765f190171800 Mon Sep 17 00:00:00 2001 From: cvictory Date: Mon, 8 Oct 2018 11:52:42 +0800 Subject: [PATCH 3/7] unit test --- .../dubbo/config/annotation/Method.java | 2 +- .../dubbo/config/MethodConfigTest.java | 53 +++++++++++++++++++ .../dubbo/config/ReferenceConfigTest.java | 2 +- .../annotation/ReferenceBeanBuilder.java | 2 +- 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Method.java b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Method.java index 963e0b1028f..0166be045d4 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Method.java +++ b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Method.java @@ -46,7 +46,7 @@ String cache() default ""; - boolean validation() default false; + String validation() default ""; Argument[] arguments() default {}; } diff --git a/dubbo-config/dubbo-config-api/src/test/java/com/alibaba/dubbo/config/MethodConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/com/alibaba/dubbo/config/MethodConfigTest.java index d3ca1814657..3a8210487bd 100644 --- a/dubbo-config/dubbo-config-api/src/test/java/com/alibaba/dubbo/config/MethodConfigTest.java +++ b/dubbo-config/dubbo-config-api/src/test/java/com/alibaba/dubbo/config/MethodConfigTest.java @@ -18,11 +18,16 @@ package com.alibaba.dubbo.config; import com.alibaba.dubbo.common.Constants; +import com.alibaba.dubbo.config.annotation.Argument; +import com.alibaba.dubbo.config.annotation.Method; +import com.alibaba.dubbo.config.annotation.Reference; import org.hamcrest.Matchers; +import org.junit.Assert; import org.junit.Test; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import static org.hamcrest.Matchers.contains; @@ -34,6 +39,54 @@ import static org.junit.Assert.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 methodConfigs = MethodConfig.constructMethodConfig(methods); + MethodConfig methodConfig = methodConfigs.get(0); + + Assert.assertEquals(METHOD_NAME, methodConfig.getName()); + Assert.assertEquals(methodConfig.getTimeout().intValue(), TIMEOUT); + Assert.assertEquals(RETRIES, methodConfig.getRetries().intValue()); + Assert.assertEquals(LOADBALANCE, methodConfig.getLoadbalance()); + Assert.assertEquals(ASYNC, methodConfig.isAsync()); + Assert.assertEquals(ACTIVES, methodConfig.getActives().intValue()); + Assert.assertEquals(EXECUTES, methodConfig.getExecutes().intValue()); + Assert.assertEquals(DEPERECATED, methodConfig.getDeprecated()); + Assert.assertEquals(STICKY, methodConfig.getSticky()); + Assert.assertEquals(ONINVOKE, methodConfig.getOninvoke()); + Assert.assertEquals(ONTHROW, methodConfig.getOnthrow()); + Assert.assertEquals(ONRETURN, methodConfig.getOnreturn()); + Assert.assertEquals(CACHE, methodConfig.getCache()); + Assert.assertEquals(VALIDATION, methodConfig.getValidation()); + Assert.assertEquals(ARGUMENTS_INDEX, methodConfig.getArguments().get(0).getIndex().intValue()); + Assert.assertEquals(ARGUMENTS_CALLBACK, methodConfig.getArguments().get(0).isCallback()); + Assert.assertEquals(ARGUMENTS_TYPE, 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/com/alibaba/dubbo/config/ReferenceConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/com/alibaba/dubbo/config/ReferenceConfigTest.java index 1c4552b18ee..b944a195216 100644 --- a/dubbo-config/dubbo-config-api/src/test/java/com/alibaba/dubbo/config/ReferenceConfigTest.java +++ b/dubbo-config/dubbo-config-api/src/test/java/com/alibaba/dubbo/config/ReferenceConfigTest.java @@ -83,7 +83,7 @@ public void testConstructWithReferenceAnnotation() throws NoSuchFieldException { @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 = 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; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/com/alibaba/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilder.java b/dubbo-config/dubbo-config-spring/src/main/java/com/alibaba/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilder.java index 41b769cd423..7014d13d770 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/com/alibaba/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilder.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/com/alibaba/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilder.java @@ -88,7 +88,7 @@ private void configureConsumerConfig(Reference reference, ReferenceBean refer } - private void configureMethodConfig(Reference reference, ReferenceBean referenceBean){ + void configureMethodConfig(Reference reference, ReferenceBean referenceBean){ Method[] methods = reference.methods(); List methodConfigs = MethodConfig.constructMethodConfig(methods); if(!methodConfigs.isEmpty()){ From 7aadbcc24957463ef7062d91c8a8a31ff2d983ee Mon Sep 17 00:00:00 2001 From: cvictory Date: Mon, 8 Oct 2018 15:48:52 +0800 Subject: [PATCH 4/7] remove unused --- .../alibaba/dubbo/examples/annotation/AnnotationConsumer.java | 1 - .../alibaba/dubbo/examples/annotation/AnnotationProvider.java | 1 - .../dubbo/examples/annotation/action/AnnotationAction.java | 2 +- 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/AnnotationConsumer.java b/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/AnnotationConsumer.java index 01fde45085f..84a1df71789 100644 --- a/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/AnnotationConsumer.java +++ b/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/AnnotationConsumer.java @@ -30,7 +30,6 @@ public class AnnotationConsumer { public static void main(String[] args) throws Exception { - System.setProperty("java.net.preferIPv4Stack", "true"); AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConsumerConfiguration.class); context.start(); final AnnotationAction annotationAction = (AnnotationAction) context.getBean("annotationAction"); diff --git a/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/AnnotationProvider.java b/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/AnnotationProvider.java index a89664df5d3..e7059252050 100644 --- a/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/AnnotationProvider.java +++ b/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/AnnotationProvider.java @@ -30,7 +30,6 @@ public class AnnotationProvider { public static void main(String[] args) throws Exception { - System.setProperty("java.net.preferIPv4Stack", "true"); AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ProviderConfiguration.class); context.start(); System.in.read(); diff --git a/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/action/AnnotationAction.java b/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/action/AnnotationAction.java index 9619c14c0fb..f55642eb66b 100644 --- a/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/action/AnnotationAction.java +++ b/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/annotation/action/AnnotationAction.java @@ -28,7 +28,7 @@ @Component("annotationAction") public class AnnotationAction { - @Reference(methods = {@Method(name = "sayHello", timeout = 1000)}) + @Reference(methods = {@Method(name = "sayHello", timeout = 5000)}) private AnnotationService annotationService; public String doSayHello(String name) { From 2dd2dd28efc021db1e2ff52db97e372b6027522a Mon Sep 17 00:00:00 2001 From: cvictory Date: Mon, 8 Oct 2018 16:00:13 +0800 Subject: [PATCH 5/7] remove author --- .../java/com/alibaba/dubbo/config/annotation/Argument.java | 4 +++- .../main/java/com/alibaba/dubbo/config/annotation/Method.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Argument.java b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Argument.java index ae5c1123e3e..b15d506ff8c 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Argument.java +++ b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Argument.java @@ -8,7 +8,9 @@ import java.lang.annotation.Target; /** - * @author cvictory ON 2018/9/29 + * @since 2.6.5 + * + * 2018/9/29 */ @Documented @Retention(RetentionPolicy.RUNTIME) diff --git a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Method.java b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Method.java index 0166be045d4..dd466ba6ce3 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Method.java +++ b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Method.java @@ -9,7 +9,9 @@ import java.lang.annotation.Target; /** - * @author cvictory ON 2018/9/29 + * @since 2.6.5 + * * + * * 2018/9/29 */ @Documented @Retention(RetentionPolicy.RUNTIME) From 815d8f36b1f8f62554c590ae731e205a2db564a3 Mon Sep 17 00:00:00 2001 From: cvictory Date: Fri, 12 Oct 2018 15:24:31 +0800 Subject: [PATCH 6/7] add licence --- .../dubbo/config/annotation/Argument.java | 16 ++++++++++++++++ .../alibaba/dubbo/config/annotation/Method.java | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Argument.java b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Argument.java index b15d506ff8c..b5d51e5a0d7 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Argument.java +++ b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Argument.java @@ -1,3 +1,19 @@ +/* + * 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 com.alibaba.dubbo.config.annotation; import java.lang.annotation.Documented; diff --git a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Method.java b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Method.java index dd466ba6ce3..6759d0ee85f 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Method.java +++ b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/annotation/Method.java @@ -1,3 +1,19 @@ +/* + * 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 com.alibaba.dubbo.config.annotation; From 67cc140349a065822c52f39d8702875dde66e7f9 Mon Sep 17 00:00:00 2001 From: cvictory Date: Thu, 1 Nov 2018 13:52:22 +0800 Subject: [PATCH 7/7] format the code --- .../main/java/com/alibaba/dubbo/config/AbstractConfig.java | 5 +++-- .../main/java/com/alibaba/dubbo/config/ArgumentConfig.java | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/AbstractConfig.java b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/AbstractConfig.java index 37c7daab52e..f9b9029f5bb 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/AbstractConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/AbstractConfig.java @@ -445,8 +445,9 @@ protected void appendAnnotation(Class annotationClass, Object annotation) { } } } - boolean isAnnotationArray(Class target){ - if(target.isArray() && target.getComponentType().isAnnotation()){ + + boolean isAnnotationArray(Class target) { + if (target.isArray() && target.getComponentType().isAnnotation()) { return true; } return false; diff --git a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ArgumentConfig.java b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ArgumentConfig.java index b1363a7e870..e5f26d4e495 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ArgumentConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ArgumentConfig.java @@ -37,9 +37,10 @@ public class ArgumentConfig implements Serializable { //callback interface private Boolean callback; - public ArgumentConfig(){ + public ArgumentConfig() { } - public ArgumentConfig(Argument argument){ + + public ArgumentConfig(Argument argument) { this.index = argument.index(); this.type = argument.type(); this.callback = argument.callback();