From 8c777111fa1b8943cf9cdebfb8c3bcdba73e39f9 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Tue, 14 Jun 2022 10:07:56 +0100 Subject: [PATCH] Revise commit #52d068 with corrected test Update test detecting RouterFunction beans in parent contexts to use different bean names and avoid shadowing. Changed the fix accordingly given that BeanProvider does detect beans in parent contexts. See gh-28595 --- .../support/RouterFunctionMapping.java | 23 +++++++++---------- .../support/RouterFunctionMappingTests.java | 6 ++--- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/support/RouterFunctionMapping.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/support/RouterFunctionMapping.java index 9bce118e9ed6..4c05f9ccb032 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/support/RouterFunctionMapping.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/support/RouterFunctionMapping.java @@ -154,20 +154,19 @@ public void afterPropertiesSet() throws Exception { * current application context. */ private void initRouterFunctions() { - List> routerFunctions = new ArrayList<>(); - detectRouterFunctions(obtainApplicationContext(), routerFunctions); - this.routerFunction = routerFunctions.stream().reduce(RouterFunction::andOther).orElse(null); - logRouterFunctions(routerFunctions); - } - - private void detectRouterFunctions(ApplicationContext context, List> routerFunctions) { - if (this.detectHandlerFunctionsInAncestorContexts && context.getParent() != null) { - detectRouterFunctions(context.getParent(), routerFunctions); - } - context.getBeanProvider(RouterFunction.class) + List> routerFunctions = obtainApplicationContext() + .getBeanProvider(RouterFunction.class) .orderedStream() .map(router -> (RouterFunction) router) - .collect(Collectors.toCollection(() -> routerFunctions)); + .collect(Collectors.toList()); + + ApplicationContext parentContext = obtainApplicationContext().getParent(); + if (parentContext != null && !this.detectHandlerFunctionsInAncestorContexts) { + parentContext.getBeanProvider(RouterFunction.class).stream().forEach(routerFunctions::remove); + } + + this.routerFunction = routerFunctions.stream().reduce(RouterFunction::andOther).orElse(null); + logRouterFunctions(routerFunctions); } private void logRouterFunctions(List> routerFunctions) { diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/support/RouterFunctionMappingTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/support/RouterFunctionMappingTests.java index 8b8ff09eec41..8d28f5e66685 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/support/RouterFunctionMappingTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/support/RouterFunctionMappingTests.java @@ -98,16 +98,16 @@ void detectHandlerFunctionsInAncestorContexts(boolean detect) throws Exception { HandlerFunction function3 = request -> ServerResponse.ok().build(); AnnotationConfigApplicationContext context1 = new AnnotationConfigApplicationContext(); - context1.registerBean(RouterFunction.class, () -> RouterFunctions.route().GET("/fn1", function1).build()); + context1.registerBean("fn1", RouterFunction.class, () -> RouterFunctions.route().GET("/fn1", function1).build()); context1.refresh(); AnnotationConfigApplicationContext context2 = new AnnotationConfigApplicationContext(); - context2.registerBean(RouterFunction.class, () -> RouterFunctions.route().GET("/fn2", function2).build()); + context2.registerBean("fn2", RouterFunction.class, () -> RouterFunctions.route().GET("/fn2", function2).build()); context2.setParent(context1); context2.refresh(); AnnotationConfigApplicationContext context3 = new AnnotationConfigApplicationContext(); - context3.registerBean(RouterFunction.class, () -> RouterFunctions.route().GET("/fn3", function3).build()); + context3.registerBean("fn3", RouterFunction.class, () -> RouterFunctions.route().GET("/fn3", function3).build()); context3.setParent(context2); context3.refresh();