[英]How do I conditionally return from a Mono within a WebFilter?
不確定我問的對不對,所以這是我想做的一個例子(以阻塞的命令式風格)
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 想要返回 aa Mono<Object>
但我的過濾器期待Mono<Void>
所以我只是將.then()
塞入其中。 我確定這是不對的。
我的代碼編譯並到達最終的 switch 語句並調用正確的 return 語句,但請求沒有到達我的 controller 。 網絡過濾器未正確轉發請求。 我只是在沒有處理程序結果的情況下返回 200 狀態。
什么是正確的反應方式來做到這一點?
我的意思是這樣的。 如果您的代碼在第一次轉換中沒有輸入,我使用.switchIfEmpty(Mono.empty())
返回一些東西。 您還可以創建一個默認Mono.just(new MyThing())
。
然后我使用flatMap
將所有邏輯switch...
放在里面。
enum MyThingEnum { A }
class MyThing { public MyThingEnum status; }
public class Test {
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
Mono<MyThing> myThingMono = getMyThingMono();
return myThingMono.flatMap(thing -> {
switch (thing.status) {
case A:
exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);
return exchange.getResponse().setComplete();
default:
exchange.getResponse().setStatusCode(HttpStatus.OK);
return chain.filter(exchange);
}
})
.switchIfEmpty(Mono.empty());
}
private Mono<MyThing> getMyThingMono() {
return Mono.just(new MyThing());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.