From d6ba91a07e624396396e9fa84cd86c360bff53d0 Mon Sep 17 00:00:00 2001 From: woyaochengweijiagoushi <1402272093@qq.com> Date: Sun, 14 Sep 2025 22:44:44 +0800 Subject: [PATCH 1/7] Sort ControllerAdviceBeans to prioritize those with selectors --- .../ExceptionHandlerExceptionResolver.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java index 879cc78b6ac6..db595b2e5a46 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java @@ -302,6 +302,18 @@ private void initExceptionHandlerAdviceCache() { } List adviceBeans = ControllerAdviceBean.findAnnotatedBeans(getApplicationContext()); + adviceBeans.sort((bean1, bean2) -> { + boolean hasSelectors1 = hasSelectors(bean1); + boolean hasSelectors2 = hasSelectors(bean2); + if (hasSelectors1 && !hasSelectors2) { + return -1; + } else if (!hasSelectors1 && hasSelectors2) { + return 1; + } else { + return 0; + } + }); + for (ControllerAdviceBean adviceBean : adviceBeans) { Class beanType = adviceBean.getBeanType(); if (beanType == null) { @@ -329,6 +341,21 @@ private void initExceptionHandlerAdviceCache() { } } + private boolean hasSelectors(ControllerAdviceBean adviceBean) { + Class beanType = adviceBean.getBeanType(); + if (beanType == null) { + return false; + } + ControllerAdvice controllerAdvice = AnnotationUtils.getAnnotation(beanType, ControllerAdvice.class); + if (controllerAdvice == null) { + return false; + } + + return (controllerAdvice.basePackages().length > 0) + || (controllerAdvice.assignableTypes().length > 0) + || (controllerAdvice.annotations().length > 0); + } + /** * Return an unmodifiable Map with the {@link ControllerAdvice @ControllerAdvice} * beans discovered in the ApplicationContext. The returned map will be empty if From e00f1d80fdfc21d23c41271dd204748549f1a67b Mon Sep 17 00:00:00 2001 From: woyaochengweijiagoushi <1402272093@qq.com> Date: Sun, 14 Sep 2025 23:11:59 +0800 Subject: [PATCH 2/7] Sort ControllerAdviceBeans to prioritize those with selectors Signed-off-by:woyaochengweijiagoushi<1402272093@qq.com> --- .../mvc/method/annotation/ExceptionHandlerExceptionResolver.java | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java index db595b2e5a46..db48925830f5 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java @@ -313,7 +313,6 @@ private void initExceptionHandlerAdviceCache() { return 0; } }); - for (ControllerAdviceBean adviceBean : adviceBeans) { Class beanType = adviceBean.getBeanType(); if (beanType == null) { From 4a55e5e943cbdc3a93530a156fc4d9d6f6c304e3 Mon Sep 17 00:00:00 2001 From: woyaochengweijiagoushi <1402272093@qq.com> Date: Sun, 14 Sep 2025 23:44:39 +0800 Subject: [PATCH 3/7] Sort ControllerAdviceBeans to prioritize those with selectors Signed-off-by:woyaochengweijiagoushi <1402272093@qq.com> --- .../mvc/method/annotation/ExceptionHandlerExceptionResolver.java | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java index db48925830f5..db595b2e5a46 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java @@ -313,6 +313,7 @@ private void initExceptionHandlerAdviceCache() { return 0; } }); + for (ControllerAdviceBean adviceBean : adviceBeans) { Class beanType = adviceBean.getBeanType(); if (beanType == null) { From 256db6b07693103dda6de1e1c6551987cb0b3121 Mon Sep 17 00:00:00 2001 From: woyaochengweijiagoushi <1402272093@qq.com> Date: Sun, 14 Sep 2025 23:47:54 +0800 Subject: [PATCH 4/7] Sort ControllerAdviceBeans to prioritize those with selectors Signed-off-by: woyaochengweijiagoushi <1402272093@qq.com> --- .../mvc/method/annotation/ExceptionHandlerExceptionResolver.java | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java index db595b2e5a46..db48925830f5 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java @@ -313,7 +313,6 @@ private void initExceptionHandlerAdviceCache() { return 0; } }); - for (ControllerAdviceBean adviceBean : adviceBeans) { Class beanType = adviceBean.getBeanType(); if (beanType == null) { From a4a0ead765198e509a961f98c74bc3a30e6584b7 Mon Sep 17 00:00:00 2001 From: woyaochengweijiagoushi <1402272093@qq.com> Date: Mon, 15 Sep 2025 00:08:29 +0800 Subject: [PATCH 5/7] Fix #35463: Prioritize ControllerAdvice with selectors Signed-off-by: woyaochengweijiagoushi <1402272093@qq.com> --- .../mvc/method/annotation/ExceptionHandlerExceptionResolver.java | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java index db48925830f5..db595b2e5a46 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java @@ -313,6 +313,7 @@ private void initExceptionHandlerAdviceCache() { return 0; } }); + for (ControllerAdviceBean adviceBean : adviceBeans) { Class beanType = adviceBean.getBeanType(); if (beanType == null) { From f7e5fad06aa7e0fe515bbd8191f68169953b96ca Mon Sep 17 00:00:00 2001 From: woyaochengweijiagoushi <1402272093@qq.com> Date: Sun, 14 Sep 2025 23:47:54 +0800 Subject: [PATCH 6/7] Sort ControllerAdviceBeans to prioritize those with selectors Signed-off-by: woyaochengweijiagoushi <1402272093@qq.com> --- .../mvc/method/annotation/ExceptionHandlerExceptionResolver.java | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java index db595b2e5a46..db48925830f5 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java @@ -313,7 +313,6 @@ private void initExceptionHandlerAdviceCache() { return 0; } }); - for (ControllerAdviceBean adviceBean : adviceBeans) { Class beanType = adviceBean.getBeanType(); if (beanType == null) { From 499045199978d0c17048286ff561ca6059c80b38 Mon Sep 17 00:00:00 2001 From: woyaochengweijiagoushi <1402272093@qq.com> Date: Wed, 17 Sep 2025 22:12:57 +0800 Subject: [PATCH 7/7] Sort ControllerAdviceBeans to prioritize those with selectors Signed-off-by: woyaochengweijiagoushi <1402272093@qq.com> --- .../mvc/method/annotation/ExceptionHandlerExceptionResolver.java | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java index db48925830f5..9c2835de7ca0 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java @@ -294,6 +294,7 @@ private void initMessageConverters() { this.messageConverters.add(new ByteArrayHttpMessageConverter()); this.messageConverters.add(new StringHttpMessageConverter()); this.messageConverters.add(new AllEncompassingFormHttpMessageConverter()); + } private void initExceptionHandlerAdviceCache() {