From 87fac14505211b16ee4f6f3b5bdeae1a8295701d Mon Sep 17 00:00:00 2001 From: Chintan Radia Date: Tue, 13 Jul 2021 22:44:21 +0530 Subject: [PATCH 1/2] Fix startup failure when using VaultPropertySource + reactive (#1994) Fixes gh-1990 When using `@ValuePropertySource` in reactive web app, `KafkaSender` bean is getting created before `BeanPostProcessor` populate `@Value` and as a result topic is passed as `null` in `KafkaSender.Builder` and it throws `NullPointerException` To resolve this we are using `Environment` to get the property value instead on relying on `BeanPostProcessor` to populate `@Value` --- .../zipkin2/ZipkinKafkaSenderConfiguration.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinKafkaSenderConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinKafkaSenderConfiguration.java index 2f9a43577..bd08f3c48 100644 --- a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinKafkaSenderConfiguration.java +++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinKafkaSenderConfiguration.java @@ -20,10 +20,10 @@ import java.util.List; import java.util.Map; import org.apache.kafka.common.serialization.ByteArraySerializer; +import org.springframework.core.env.Environment; import zipkin2.reporter.Sender; import zipkin2.reporter.kafka.KafkaSender; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -44,9 +44,6 @@ class ZipkinKafkaSenderConfiguration { @EnableConfigurationProperties(KafkaProperties.class) static class ZipkinKafkaSenderBeanConfiguration { - @Value("${spring.zipkin.kafka.topic:zipkin}") - private String topic; - static String join(List parts) { StringBuilder to = new StringBuilder(); for (int i = 0, length = parts.size(); i < length; i++) { @@ -59,7 +56,12 @@ class ZipkinKafkaSenderConfiguration { } @Bean(ZipkinAutoConfiguration.SENDER_BEAN_NAME) - Sender kafkaSender(KafkaProperties config) { + Sender kafkaSender(KafkaProperties config, Environment environment) { + // Need to get property value from Environment + // because when using @VaultPropertySource in reactive web app + // this bean is initiated before @Value is resolved + // See gh-1990 + String topic = environment.getProperty("spring.zipkin.kafka.topic", "zipkin"); Map properties = config.buildProducerProperties(); properties.put("key.serializer", ByteArraySerializer.class.getName()); properties.put("value.serializer", ByteArraySerializer.class.getName()); @@ -68,7 +70,7 @@ class ZipkinKafkaSenderConfiguration { if (bootstrapServers instanceof List) { properties.put("bootstrap.servers", join((List) bootstrapServers)); } - return KafkaSender.newBuilder().topic(this.topic).overrides(properties).build(); + return KafkaSender.newBuilder().topic(topic).overrides(properties).build(); } } From dabd32b3ef1715f8cd4a03d648fed5b8da14cca4 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 14 Jul 2021 15:27:32 +0200 Subject: [PATCH 2/2] Checkstyle fix --- .../autoconfig/zipkin2/ZipkinKafkaSenderConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinKafkaSenderConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinKafkaSenderConfiguration.java index bd08f3c48..4df408734 100644 --- a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinKafkaSenderConfiguration.java +++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinKafkaSenderConfiguration.java @@ -20,7 +20,6 @@ import java.util.List; import java.util.Map; import org.apache.kafka.common.serialization.ByteArraySerializer; -import org.springframework.core.env.Environment; import zipkin2.reporter.Sender; import zipkin2.reporter.kafka.KafkaSender; @@ -32,6 +31,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; @Configuration(proxyBeanMethods = false) @ConditionalOnClass(ByteArraySerializer.class)