我使用ServerWebExchangeContextFilter过滤器在spring提供的上下文映射中存储当前的ServerWebExchange上下文。但是,当我尝试从代码的不同部分(下游)获取这个已保存的ServerWebExchange上下文时,我从针对键EXCHANGE_CONTEXT_ATTRIBUTE的上下文映射中获得了一个空上下文。
Context ctx = Mono.subscriberContext()
.map(ServerWebExchangeContextFilter::get)
assert ctx.isPresent()==true // This assert always failsServerWebExchangeContextFitler类具有以下定义:
public class ServerWebExchangeContextFilter implements WebFilter {
public static final String EXCHANGE_CONTEXT_ATTRIBUTE =
ServerWebExchangeContextFilter.class.getName() + ".EXCHANGE_CONTEXT";
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
return chain.filter(exchange)
.subscriberContext(cxt -> cxt.put(EXCHANGE_CONTEXT_ATTRIBUTE, exchange));
}
public static Optional<ServerWebExchange> get(Context context) {
return context.getOrEmpty(EXCHANGE_CONTEXT_ATTRIBUTE);
}
}我正在为我的组织编写一个通用库函数,因此希望避免在参数元组中传递ServerHttpRequest。因此,请发布一个答案,使我能够从静态函数访问上下文。
发布于 2020-08-12 04:53:48
我找到了解决这个问题的办法。显然,我试图从一个孤立的函数中获取保存的上下文。通过将这个Mono添加到我原始控制器的执行链中,我能够解决这个问题。这是因为ServerWebExchangeContextFilter将上下文保存在我的控制器的执行链中。现在,因为我想添加一个获取请求上下文的库方法,所以我必须使用平面映射将此函数链接到我的控制器。
https://stackoverflow.com/questions/63363256
复制相似问题