我有一个像这样的 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/