From a1cb4eb05020f68b89d31fc32a910ae4066298e1 Mon Sep 17 00:00:00 2001 From: Jivebread Date: Thu, 16 May 2024 22:45:48 +0900 Subject: [PATCH] Fixes missing circuit breaker id Given yaml Properties, CircuitBreaker(`CircuitConfig`) method passes binding test even when given value is `ID` not `CircuitConfig` - operation method that is annotated with @configuration always pass binding test [findOperation] thereby creating wrong binding from property to method Introducing Sorting to the operations, it will resolve methods without @configuration to be processed first and @configuration will be matched the last. Fixes gh-3327 Fixes gh-3397 --- .../gateway/server/mvc/config/RouterFunctionHolderFactory.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/RouterFunctionHolderFactory.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/RouterFunctionHolderFactory.java index e75b259f..f612d07d 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/RouterFunctionHolderFactory.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/RouterFunctionHolderFactory.java @@ -22,6 +22,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Comparator; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; @@ -244,6 +245,7 @@ public class RouterFunctionHolderFactory { String operationName, Map operationArgs) { return operations.getOrDefault(operationName, Collections.emptyList()) .stream() + .sorted(Comparator.comparing(OperationMethod::isConfigurable)) .map(operationMethod -> new NormalizedOperationMethod(operationMethod, operationArgs)) .filter(opeMethod -> matchOperation(opeMethod, operationArgs)) .findFirst();