我正在构建一个 GatewayFilter,但在处理没有数据的情况时遇到了问题。以下是 GatewayFilterFactory<> 的示例:
return (exchange, chain) -> getDataFromRedis()
.flatMap(redisData -> {
ServerHttpRequest request = exchange.getRequest().mutate()
.header("header", redisData).build();
return chain.filter(exchange.mutate().request(request).build());
});
这是getDataFromRedis
方法:
Mono<String> getDataFromRedis() {
return redis.get("key");
}
它返回一个带有字符串值的 Mono,如果没有找到,则返回空。
上面的例子按预期工作,但是当redis的数据没有找到,并且返回了一个空的Mono,那么我需要它来返回一个重定向。所以这是我的尝试:
return (exchange, chain) -> getDataFromRedis()
.flatMap(redisData -> {
ServerHttpRequest request = exchange.getRequest().mutate()
.header("header", redisData).build();
return chain.filter(exchange.mutate().request(request).build());
})
.switchIfEmpty(Mono.defer(() -> {
exchange.getResponse().setStatusCode(HttpStatus.FOUND);
exchange.getResponse().getHeaders().add(HttpHeaders.LOCATION, "some other url");
return exchange.getResponse().setComplete();
}));
延迟的 mono inswitchIfEmpty
总是被调用,不管 redis 中是否有数据。
总而言之,我需要过滤器添加从 Redis 获取的标头值,但如果没有可用数据则重定向。