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 5e9611609275..5f2bcb832074 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 @@ -52,11 +52,7 @@ import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; -import java.util.Arrays; -import java.util.Collection; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; +import java.util.*; import static com.alibaba.dubbo.config.spring.util.ObjectUtils.of; import static org.springframework.beans.factory.support.BeanDefinitionBuilder.rootBeanDefinition; @@ -370,7 +366,7 @@ private AbstractBeanDefinition buildServiceBeanDefinition(Service service, Class MutablePropertyValues propertyValues = beanDefinition.getPropertyValues(); String[] ignoreAttributeNames = of("provider", "monitor", "application", "module", "registry", "protocol", - "interface", "interfaceName"); + "interface", "interfaceName", "parameters"); propertyValues.addPropertyValues(new AnnotationPropertyValuesAdapter(service, environment, ignoreAttributeNames)); @@ -378,6 +374,8 @@ private AbstractBeanDefinition buildServiceBeanDefinition(Service service, Class addPropertyReference(builder, "ref", annotatedServiceBeanName); // Set interface builder.addPropertyValue("interface", interfaceClass.getName()); + // Set parameters + builder.addPropertyValue("parameters",convertParameters(service.parameters())); /** * Add {@link com.alibaba.dubbo.config.ProviderConfig} Bean reference @@ -469,6 +467,26 @@ private void addPropertyReference(BeanDefinitionBuilder builder, String property builder.addPropertyReference(propertyName, resolvedBeanName); } + /** + * Converts the string array parameters to map. + * @param parameters the parameters to convert. + * @return the converted parameters as a map. + */ + private Map convertParameters(String[] parameters) { + if (parameters == null || parameters.length == 0) { + return null; + } + + if (parameters.length % 2 != 0) { + throw new IllegalArgumentException("parameter attribute must be paired with key followed by value"); + } + + Map map = new HashMap(); + for (int i = 0; i < parameters.length; i += 2) { + map.put(parameters[i], parameters[i + 1]); + } + return map; + } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { diff --git a/dubbo-config/dubbo-config-spring/src/test/java/com/alibaba/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessorTest.java b/dubbo-config/dubbo-config-spring/src/test/java/com/alibaba/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessorTest.java index 22b1f56f1764..528ebfd26967 100644 --- a/dubbo-config/dubbo-config-spring/src/test/java/com/alibaba/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessorTest.java +++ b/dubbo-config/dubbo-config-spring/src/test/java/com/alibaba/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessorTest.java @@ -16,6 +16,7 @@ */ package com.alibaba.dubbo.config.spring.beans.factory.annotation; +import com.alibaba.dubbo.config.annotation.Service; import com.alibaba.dubbo.config.spring.ServiceBean; import com.alibaba.dubbo.config.spring.api.HelloService; @@ -79,4 +80,20 @@ public void test() { } + /** + * Test if the {@link Service#parameters()} works well + * see issue: https://github.com/apache/dubbo/issues/3072 + */ + @Test + public void testDubboServiceParameter() { + /** + * get the {@link ServiceBean} of {@link com.alibaba.dubbo.config.spring.context.annotation.provider.DefaultHelloService} + * */ + ServiceBean serviceBean = beanFactory.getBean("ServiceBean:com.alibaba.dubbo.config.spring.api.HelloService", ServiceBean.class); + Assert.assertNotNull(serviceBean); + Assert.assertNotNull(serviceBean.getParameters()); + Assert.assertTrue(serviceBean.getParameters().size() == 1); + Assert.assertEquals(serviceBean.toUrl().getParameter("sayHello.timeout"), "3000"); + } + } diff --git a/dubbo-config/dubbo-config-spring/src/test/java/com/alibaba/dubbo/config/spring/context/annotation/provider/DefaultHelloService.java b/dubbo-config/dubbo-config-spring/src/test/java/com/alibaba/dubbo/config/spring/context/annotation/provider/DefaultHelloService.java index 5b5f8946d05c..b23b9f993cb2 100644 --- a/dubbo-config/dubbo-config-spring/src/test/java/com/alibaba/dubbo/config/spring/context/annotation/provider/DefaultHelloService.java +++ b/dubbo-config/dubbo-config-spring/src/test/java/com/alibaba/dubbo/config/spring/context/annotation/provider/DefaultHelloService.java @@ -27,7 +27,7 @@ * @since TODO */ @Service -@com.alibaba.dubbo.config.annotation.Service +@com.alibaba.dubbo.config.annotation.Service(parameters = {"sayHello.timeout", "3000"}) public class DefaultHelloService implements HelloService { @Override