diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/URLBuilder.java b/dubbo-common/src/main/java/org/apache/dubbo/common/URLBuilder.java index 7ab8bb3415..1ecf648a14 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/URLBuilder.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/URLBuilder.java @@ -336,7 +336,9 @@ public final class URLBuilder extends ServiceConfigURL { if (CollectionUtils.isEmptyMap(parameters)) { return this; } - this.parameters.putAll(parameters); + for(Map.Entry entry : parameters.entrySet()) { + this.parameters.putIfAbsent(entry.getKey(), entry.getValue()); + } return this; } diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/URLBuilderTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/URLBuilderTest.java index 5fa5becd7d..8b1148e6a8 100644 --- a/dubbo-common/src/test/java/org/apache/dubbo/common/URLBuilderTest.java +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/URLBuilderTest.java @@ -19,6 +19,8 @@ package org.apache.dubbo.common; import org.junit.jupiter.api.Test; import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; @@ -97,4 +99,46 @@ public class URLBuilderTest { assertThat(url2.getVersion(), equalTo("1.0.0")); assertThat(url2.getParameter("absentKey"), equalTo("absentValue")); } + + @Test + public void shouldAddParameters() { + URL url1 = URL.valueOf("dubbo://admin:hello1234@10.20.130.230:20880/context/path?version=1.0.0&application=morgan&key2=v2"); + + // string pairs test + URL url2 = URLBuilder.from(url1) + .addParameters("version", "1.0.0", "absentKey1", "absentValue1") + .build(); + assertThat(url2.getParameter("version"), equalTo("1.0.0")); + assertThat(url2.getParameter("absentKey1"), equalTo("absentValue1")); + + // map test + Map parameters = new HashMap(){ + { + this.put("version", "2.0.0"); + this.put("absentKey2", "absentValue2"); + } + }; + url2 = URLBuilder.from(url1) + .addParameters(parameters) + .build(); + assertThat(url2.getParameter("version"), equalTo("2.0.0")); + assertThat(url2.getParameter("absentKey2"), equalTo("absentValue2")); + } + + @Test + public void shouldAddParametersIfAbsent() { + URL url1 = URL.valueOf("dubbo://admin:hello1234@10.20.130.230:20880/context/path?version=1.0.0&application=morgan&key2=v2"); + + Map parameters = new HashMap(){ + { + this.put("version", "2.0.0"); + this.put("absentKey", "absentValue"); + } + }; + URL url2 = URLBuilder.from(url1) + .addParametersIfAbsent(parameters) + .build(); + assertThat(url2.getParameter("version"), equalTo("1.0.0")); + assertThat(url2.getParameter("absentKey"), equalTo("absentValue")); + } }