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(); + } + + } + }