spring-webflux - 访问@WebFluxTest中的WebSession

标签 spring-webflux

我有一个像这样的 Controller :

@RestController
public class ApiController {
    @GetMapping(path = "/somethings")
    public Mono<String> getThings(final WebSession webSession) {
        if (!webSession.getAttribute("state").equals("started")) {
            throw new RuntimeException("Cannot make API calls until session has started");
        }

        // Make api calls here...
    }
}

在我的@WebFluxTest 中,我需要访问网络 session 以将“state”属性设置为“started”。

有没有办法在 @WebFluxTest 中访问和更新 WebSession?

最佳答案

找到答案了。

WebTestClient 有一个 mutateWith 方法,您可以在其中传递 WebTestClientConfigurer

通过创建自定义 WebTestClientConfigurer,可以添加 session 属性。

public class SessionMutator implements WebTestClientConfigurer {

    private static Map<String, Object> sessionMap;

    private SessionMutator(final Map<String, Object> sessionMap) {
        this.sessionMap = sessionMap;
    }

    public static SessionMutator sessionMutator(final Map<String, Object> sessionMap) {
        return new SessionMutator(sessionMap);
    }

    @Override
    public void afterConfigurerAdded(final WebTestClient.Builder builder,
                                     final WebHttpHandlerBuilder httpHandlerBuilder,
                                     final ClientHttpConnector connector) {
        final SessionMutatorFilter sessionMutatorFilter = new SessionMutatorFilter();
        httpHandlerBuilder.filters(filters -> filters.add(0, sessionMutatorFilter));
    }

    public static ImmutableMap.Builder<String, Object> sessionBuilder() {
        return new ImmutableMap.Builder<String, Object>();
    }

    private static class SessionMutatorFilter implements WebFilter {
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain webFilterChain) {
            return exchange.getSession()
                           .doOnNext(webSession -> webSession.getAttributes().putAll(sessionMap))
                           .then(webFilterChain.filter(exchange));
        }
    }
}

然后在@WebFluxTest中可以执行以下操作:

webTestClient.mutateWith(sessionMutator(sessionBuilder().put("sessionKey", "sessionValue").build()))

关于spring-webflux - 访问@WebFluxTest中的WebSession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50214030/

相关文章:

java - 如何在Spring React的ServerHttpResponse中设置非标准的HttpStatus?

java - Mono<Void> 和 Mono.empty() 有何不同

java - Spring WebFlux + Security - 我们有 "remember-me"功能吗?

kotlin - 在 WebClient onErrorResume 中反序列化没有对象映射器的错误响应

java - Spring WebFlux : How to access Request Body in HandlerFilterFunction

java - WebClient maxConnection池限制?

java - JUnit 5 和 Webflux 的 Spring Rest 文档

java - Grafana 仪表板将执行器池的 "boundedElastic"与 "parallel"分开

java - ReactiveRedisTemplate opsForHash put 不会覆盖值

java - Spring Boot requestDataValueProcessor Bean 定义冲突