From 53b937976d478371db58c4bb85e3fa96efd22b76 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Tue, 19 Dec 2023 17:35:02 +0100 Subject: [PATCH] Reject setups with multiple observation conventions Prior to this commit, the `WebHttpHandlerBuilder` would only configure a custom observation convention if there is a single convention in the application context. It would other wise use the default. This commit aligns with the previous Spring Boot behavior where multiple conventions setups are rejected as invalid with `NoUniqueBeanDefinitionException`. Fixes gh-31864 --- .../server/adapter/WebHttpHandlerBuilder.java | 2 +- .../adapter/WebHttpHandlerBuilderTests.java | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/spring-web/src/main/java/org/springframework/web/server/adapter/WebHttpHandlerBuilder.java b/spring-web/src/main/java/org/springframework/web/server/adapter/WebHttpHandlerBuilder.java index 1b09810ecd..68f0992936 100644 --- a/spring-web/src/main/java/org/springframework/web/server/adapter/WebHttpHandlerBuilder.java +++ b/spring-web/src/main/java/org/springframework/web/server/adapter/WebHttpHandlerBuilder.java @@ -198,7 +198,7 @@ public final class WebHttpHandlerBuilder { .forEach(builder::httpHandlerDecorator); context.getBeanProvider(ObservationRegistry.class).ifUnique(builder::observationRegistry); - context.getBeanProvider(ServerRequestObservationConvention.class).ifUnique(builder::observationConvention); + context.getBeanProvider(ServerRequestObservationConvention.class).ifAvailable(builder::observationConvention); try { builder.sessionManager( diff --git a/spring-web/src/test/java/org/springframework/web/server/adapter/WebHttpHandlerBuilderTests.java b/spring-web/src/test/java/org/springframework/web/server/adapter/WebHttpHandlerBuilderTests.java index 522d8aafb1..c9ed2b8b21 100644 --- a/spring-web/src/test/java/org/springframework/web/server/adapter/WebHttpHandlerBuilderTests.java +++ b/spring-web/src/test/java/org/springframework/web/server/adapter/WebHttpHandlerBuilderTests.java @@ -28,6 +28,7 @@ import org.junit.jupiter.api.Test; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import org.springframework.beans.factory.NoUniqueBeanDefinitionException; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -49,6 +50,7 @@ import org.springframework.web.testfixture.http.server.reactive.MockServerHttpRe import static java.time.Duration.ofMillis; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; /** * Unit tests for {@link WebHttpHandlerBuilder}. @@ -173,6 +175,14 @@ public class WebHttpHandlerBuilderTests { .that().hasLowCardinalityKeyValue("uri", "UNKNOWN"); } + @Test + void shouldRejectDuplicateObservationConvention() { + AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ObservationConfig.class, + DuplicateConventionObservationConfig.class); + assertThatThrownBy(() -> WebHttpHandlerBuilder.applicationContext(applicationContext).build()) + .isInstanceOf(NoUniqueBeanDefinitionException.class); + } + private static Mono writeToResponse(ServerWebExchange exchange, String value) { byte[] bytes = value.getBytes(StandardCharsets.UTF_8); DataBuffer buffer = DefaultDataBufferFactory.sharedInstance.wrap(bytes); @@ -315,4 +325,14 @@ public class WebHttpHandlerBuilderTests { } + @Configuration + static class DuplicateConventionObservationConfig { + + @Bean + public ServerRequestObservationConvention duplicateRequestObservationConvention() { + return new DefaultServerRequestObservationConvention(); + } + + } + }