【发布时间】:2021-06-22 20:14:54
【问题描述】:
不知道我问的对不对,所以这里有一个我想做的例子(以命令式的阻塞方式)
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
Mono<MyThing> myThingMono = getMyThingMono();
// I Know this is not right but it's effectively what I want to do
if( myThingMono is empty ) {
return chain.filter(exchange);
} else {
MyThing thing = myThingMono.block(); // I know I can't do this
switch(thing.status) {
case A:
exchange.getResponse().setStatus(HttpStatus.BAD_REQUEST);
return exchange.getResponse().setComplete();
default:
return chain.filter(exchange);
}
}
}
这是我以被动方式获得的最接近的结果
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
Mono<MyThing> myThingMono = getMyThingMono();
myThingMono.map(thing -> {
switch(thing.status) {
case A: return HttpStatus.BAD_REQUEST;
default: return HttpStatus.OK;
}
})
.defaultIfEmpty(HttpStatus.OK) // in case myThingMono is empty
.map(status -> {
switch(status) {
case HttpStatus.OK:
return chain.filter(exchange);
default:
exchange.getResponse().setStatusCode(status);
return exchange.getResponse().setComplete();
}
})
.then();
myThingMono 想要返回一个Mono<Object>,但我的过滤器期待一个Mono<Void>,所以我只是将.then() 塞入其中。我确定这是不对的。
我的代码编译并到达最后一个 switch 语句并调用正确的 return 语句,但 请求没有到达我的控制器。网络过滤器未正确转发请求。我只是在没有处理程序结果的情况下返回 200 状态。
什么是正确的反应方式?
【问题讨论】:
-
将第二张地图的代码放在第一张地图中,去掉
.then()。 -
如果一切都在第一张地图中,如果
myThingMono为空会发生什么?第一个地图功能将被完全跳过。另外,我认为问题在于地图内的return函数没有转发请求。也许我不完全理解该提案,所以如果您可以在答案中提供一些代码,它可能会有所帮助
标签: java spring-boot reactive-programming spring-webflux project-reactor