From 5b43c6579f7699952610b17ad013e7a22215cea0 Mon Sep 17 00:00:00 2001 From: lzhpo Date: Sun, 2 Jan 2022 15:17:00 +0800 Subject: [PATCH] 1. Replace keys with scan when get routeDefinitions. 2. Fix null pointer exception when filters are null. --- .../cloud/gateway/route/RedisRouteDefinitionRepository.java | 5 ++++- .../cloud/gateway/route/RouteDefinitionRouteLocator.java | 6 ++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/RedisRouteDefinitionRepository.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/RedisRouteDefinitionRepository.java index c157ca8e..0beef09f 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/RedisRouteDefinitionRepository.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/RedisRouteDefinitionRepository.java @@ -24,10 +24,12 @@ import reactor.core.publisher.Mono; import org.springframework.cloud.gateway.support.NotFoundException; import org.springframework.data.redis.core.ReactiveRedisTemplate; import org.springframework.data.redis.core.ReactiveValueOperations; +import org.springframework.data.redis.core.ScanOptions; import org.springframework.stereotype.Repository; /** * @author Dennis Menge + * @author lzhpo */ @Repository public class RedisRouteDefinitionRepository implements RouteDefinitionRepository { @@ -50,7 +52,8 @@ public class RedisRouteDefinitionRepository implements RouteDefinitionRepository @Override public Flux getRouteDefinitions() { - return reactiveRedisTemplate.keys(createKey("*")).flatMap(key -> reactiveRedisTemplate.opsForValue().get(key)) + return reactiveRedisTemplate.scan(ScanOptions.scanOptions().match(createKey("*")).build()) + .flatMap(key -> reactiveRedisTemplate.opsForValue().get(key)) .onErrorContinue((throwable, routeDefinition) -> { if (log.isErrorEnabled()) { log.error("get routes from redis error cause : {}", throwable.toString(), throwable); diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocator.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocator.java index 05faa322..0159c56a 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocator.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocator.java @@ -40,6 +40,7 @@ import org.springframework.cloud.gateway.support.ConfigurationService; import org.springframework.cloud.gateway.support.HasRouteId; import org.springframework.core.Ordered; import org.springframework.core.annotation.AnnotationAwareOrderComparator; +import org.springframework.util.CollectionUtils; import org.springframework.web.server.ServerWebExchange; /** @@ -172,8 +173,9 @@ public class RouteDefinitionRouteLocator implements RouteLocator { new ArrayList<>(this.gatewayProperties.getDefaultFilters()))); } - if (!routeDefinition.getFilters().isEmpty()) { - filters.addAll(loadGatewayFilters(routeDefinition.getId(), new ArrayList<>(routeDefinition.getFilters()))); + final List definitionFilters = routeDefinition.getFilters(); + if (!CollectionUtils.isEmpty(definitionFilters)) { + filters.addAll(loadGatewayFilters(routeDefinition.getId(), definitionFilters)); } AnnotationAwareOrderComparator.sort(filters);