diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/pulsar/PulsarPropertiesMapper.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/pulsar/PulsarPropertiesMapper.java index 04246d0e91c..ed9411512eb 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/pulsar/PulsarPropertiesMapper.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/pulsar/PulsarPropertiesMapper.java @@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure.pulsar; import java.time.Duration; import java.util.ArrayList; import java.util.Map; +import java.util.TreeMap; import java.util.concurrent.TimeUnit; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -29,6 +30,7 @@ import org.apache.pulsar.client.api.ConsumerBuilder; import org.apache.pulsar.client.api.ProducerBuilder; import org.apache.pulsar.client.api.PulsarClientException.UnsupportedAuthenticationException; import org.apache.pulsar.client.api.ReaderBuilder; +import org.apache.pulsar.common.util.ObjectMapperFactory; import org.springframework.boot.context.properties.PropertyMapper; import org.springframework.pulsar.listener.PulsarContainerProperties; @@ -73,7 +75,8 @@ final class PulsarPropertiesMapper { PulsarProperties.Authentication properties) { if (StringUtils.hasText(properties.getPluginClassName())) { try { - authentication.accept(properties.getPluginClassName(), properties.getParam()); + authentication.accept(properties.getPluginClassName(), + getAuthenticationParamsJson(properties.getParam())); } catch (UnsupportedAuthenticationException ex) { throw new IllegalStateException("Unable to configure Pulsar authentication", ex); @@ -81,6 +84,16 @@ final class PulsarPropertiesMapper { } } + private String getAuthenticationParamsJson(Map params) { + Map sortedParams = new TreeMap<>(params); + try { + return ObjectMapperFactory.create().writeValueAsString(sortedParams); + } + catch (Exception ex) { + throw new IllegalStateException("Could not convert auth parameters to encoded string", ex); + } + } + void customizeProducerBuilder(ProducerBuilder producerBuilder) { PulsarProperties.Producer properties = this.properties.getProducer(); PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull(); @@ -158,8 +171,7 @@ final class PulsarPropertiesMapper { private interface AuthenticationConsumer { - void accept(String authPluginClassName, Map authParams) - throws UnsupportedAuthenticationException; + void accept(String authPluginClassName, String authParamString) throws UnsupportedAuthenticationException; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/pulsar/PulsarPropertiesMapperTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/pulsar/PulsarPropertiesMapperTests.java index b168d4f7130..458b3abf480 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/pulsar/PulsarPropertiesMapperTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/pulsar/PulsarPropertiesMapperTests.java @@ -73,12 +73,13 @@ class PulsarPropertiesMapperTests { void customizeClientBuilderWhenHasAuthentication() throws UnsupportedAuthenticationException { PulsarProperties properties = new PulsarProperties(); Map params = Map.of("param", "name"); + String authParamString = "{\"param\":\"name\"}"; properties.getClient().getAuthentication().setPluginClassName("myclass"); properties.getClient().getAuthentication().setParam(params); ClientBuilder builder = mock(ClientBuilder.class); new PulsarPropertiesMapper(properties).customizeClientBuilder(builder, new PropertiesPulsarConnectionDetails(properties)); - then(builder).should().authentication("myclass", params); + then(builder).should().authentication("myclass", authParamString); } @Test @@ -112,12 +113,13 @@ class PulsarPropertiesMapperTests { void customizeAdminBuilderWhenHasAuthentication() throws UnsupportedAuthenticationException { PulsarProperties properties = new PulsarProperties(); Map params = Map.of("param", "name"); + String authParamString = "{\"param\":\"name\"}"; properties.getAdmin().getAuthentication().setPluginClassName("myclass"); properties.getAdmin().getAuthentication().setParam(params); PulsarAdminBuilder builder = mock(PulsarAdminBuilder.class); new PulsarPropertiesMapper(properties).customizeAdminBuilder(builder, new PropertiesPulsarConnectionDetails(properties)); - then(builder).should().authentication("myclass", params); + then(builder).should().authentication("myclass", authParamString); } @Test