diff --git a/spring-web/src/main/java/org/springframework/web/filter/reactive/ServerWebExchangeContextFilter.java b/spring-web/src/main/java/org/springframework/web/filter/reactive/ServerWebExchangeContextFilter.java index 08e42e27e3..7ff17b7246 100644 --- a/spring-web/src/main/java/org/springframework/web/filter/reactive/ServerWebExchangeContextFilter.java +++ b/spring-web/src/main/java/org/springframework/web/filter/reactive/ServerWebExchangeContextFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -48,33 +48,35 @@ public class ServerWebExchangeContextFilter implements WebFilter { @Override public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { return chain.filter(exchange) - .contextWrite(cxt -> cxt.put(EXCHANGE_CONTEXT_ATTRIBUTE, exchange)); + .contextWrite(context -> context.put(EXCHANGE_CONTEXT_ATTRIBUTE, exchange)); } /** - * Access the {@link ServerWebExchange} from the Reactor Context, if available, - * which is if {@link ServerWebExchangeContextFilter} is configured for use - * and the give context was obtained from a request processing chain. - * @param context the context in which to access the exchange - * @return the exchange + * Access the {@link ServerWebExchange} from a Reactor {@link ContextView}, + * if available, which is generally the case when + * {@link ServerWebExchangeContextFilter} is present in the filter chain. + * @param contextView the contextView to get the exchange from + * @return an {@link Optional} with the exchange if found + * @since 6.0.6 */ - public static Optional getExchange(ContextView context) { + public static Optional getExchange(ContextView contextView) { + return contextView.getOrEmpty(EXCHANGE_CONTEXT_ATTRIBUTE); + } + + /** + * Access the {@link ServerWebExchange} from a Reactor {@link Context}, + * if available, which is generally the case when + * {@link ServerWebExchangeContextFilter} is present in the filter chain. + * @param context the context to get the exchange from + * @return an {@link Optional} with the exchange if found + * @deprecated in favor of using {@link #getExchange(ContextView)} which + * accepts a {@link ContextView} instead of {@link Context}, reflecting the + * fact that the {@code ContextView} is needed only for reading. + */ + @Deprecated(since = "6.0.6", forRemoval = true) + public static Optional get(Context context) { return context.getOrEmpty(EXCHANGE_CONTEXT_ATTRIBUTE); } - - /** - * Access the {@link ServerWebExchange} from the Reactor Context, if available, - * which is if {@link ServerWebExchangeContextFilter} is configured for use - * and the give context was obtained from a request processing chain. - * @param context the context in which to access the exchange - * @return the exchange - * @deprecated use {@link #getExchange(ContextView)} - */ - @Deprecated(since = "6.0.6") - public static Optional get(Context context) { - return getExchange(context); - } - } diff --git a/spring-web/src/test/java/org/springframework/web/filter/reactive/ServerWebExchangeContextFilterTests.java b/spring-web/src/test/java/org/springframework/web/filter/reactive/ServerWebExchangeContextFilterTests.java index 25f0edd7a4..196ce5f739 100644 --- a/spring-web/src/test/java/org/springframework/web/filter/reactive/ServerWebExchangeContextFilterTests.java +++ b/spring-web/src/test/java/org/springframework/web/filter/reactive/ServerWebExchangeContextFilterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,7 +22,6 @@ import java.util.concurrent.atomic.AtomicReference; import org.junit.jupiter.api.Test; import reactor.core.publisher.Mono; -import org.springframework.http.server.reactive.HttpHandler; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.adapter.WebHttpHandlerBuilder; import org.springframework.web.testfixture.http.server.reactive.MockServerHttpRequest; @@ -36,16 +35,16 @@ import static org.assertj.core.api.Assertions.assertThat; */ class ServerWebExchangeContextFilterTests { + @Test void extractServerWebExchangeFromContext() { MyService service = new MyService(); - HttpHandler httpHandler = WebHttpHandlerBuilder + WebHttpHandlerBuilder .webHandler(exchange -> service.service().then()) .filter(new ServerWebExchangeContextFilter()) - .build(); - - httpHandler.handle(MockServerHttpRequest.get("/path").build(), new MockServerHttpResponse()) + .build() + .handle(MockServerHttpRequest.get("/path").build(), new MockServerHttpResponse()) .block(Duration.ofSeconds(5)); assertThat(service.getExchange()).isNotNull(); @@ -56,16 +55,16 @@ class ServerWebExchangeContextFilterTests { private final AtomicReference exchangeRef = new AtomicReference<>(); - public ServerWebExchange getExchange() { return this.exchangeRef.get(); } public Mono service() { - return Mono.just("result").contextWrite(context -> { - ServerWebExchangeContextFilter.getExchange(context).ifPresent(exchangeRef::set); - return context; - }); + return Mono.just("result") + .transformDeferredContextual((mono, contextView) -> { + ServerWebExchangeContextFilter.getExchange(contextView).ifPresent(exchangeRef::set); + return mono; + }); } }