0

我正在构建一个 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 获取的标头值,但如果没有可用数据则重定向。

4

0 回答 0