我正在构建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();
}));
switchIfEmpty
中的延迟单声道总是被调用,而不管redis中是否有数据。
总而言之,我需要过滤器添加从Redis获取的标头值,但是如果没有可用数据则重定向。