Skip to content

Commit 53b9379

Browse files
committed
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
1 parent 12f01f9 commit 53b9379

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

spring-web/src/main/java/org/springframework/web/server/adapter/WebHttpHandlerBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ public static WebHttpHandlerBuilder applicationContext(ApplicationContext contex
198198
.forEach(builder::httpHandlerDecorator);
199199

200200
context.getBeanProvider(ObservationRegistry.class).ifUnique(builder::observationRegistry);
201-
context.getBeanProvider(ServerRequestObservationConvention.class).ifUnique(builder::observationConvention);
201+
context.getBeanProvider(ServerRequestObservationConvention.class).ifAvailable(builder::observationConvention);
202202

203203
try {
204204
builder.sessionManager(

spring-web/src/test/java/org/springframework/web/server/adapter/WebHttpHandlerBuilderTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import reactor.core.publisher.Flux;
2929
import reactor.core.publisher.Mono;
3030

31+
import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
3132
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
3233
import org.springframework.context.annotation.Bean;
3334
import org.springframework.context.annotation.Configuration;
@@ -49,6 +50,7 @@
4950

5051
import static java.time.Duration.ofMillis;
5152
import static org.assertj.core.api.Assertions.assertThat;
53+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
5254

5355
/**
5456
* Unit tests for {@link WebHttpHandlerBuilder}.
@@ -173,6 +175,14 @@ void observationRegistry() {
173175
.that().hasLowCardinalityKeyValue("uri", "UNKNOWN");
174176
}
175177

178+
@Test
179+
void shouldRejectDuplicateObservationConvention() {
180+
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ObservationConfig.class,
181+
DuplicateConventionObservationConfig.class);
182+
assertThatThrownBy(() -> WebHttpHandlerBuilder.applicationContext(applicationContext).build())
183+
.isInstanceOf(NoUniqueBeanDefinitionException.class);
184+
}
185+
176186
private static Mono<Void> writeToResponse(ServerWebExchange exchange, String value) {
177187
byte[] bytes = value.getBytes(StandardCharsets.UTF_8);
178188
DataBuffer buffer = DefaultDataBufferFactory.sharedInstance.wrap(bytes);
@@ -315,4 +325,14 @@ public WebHandler webHandler() {
315325

316326
}
317327

328+
@Configuration
329+
static class DuplicateConventionObservationConfig {
330+
331+
@Bean
332+
public ServerRequestObservationConvention duplicateRequestObservationConvention() {
333+
return new DefaultServerRequestObservationConvention();
334+
}
335+
336+
}
337+
318338
}

0 commit comments

Comments
 (0)