From caa3564b657472c90c17c3da6c33c662bb3018be Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Wed, 26 Mar 2025 15:14:29 +0100 Subject: [PATCH 01/13] pmd --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index 6dfc08b0ee81..b6e5a5344128 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,7 @@ plugins { id 'io.github.goooler.shadow' version '8.1.8' apply false id 'me.champeau.jmh' version '0.7.2' apply false id "net.ltgt.errorprone" version "4.1.0" apply false + id 'k' } ext { From 45d50897426a73879cfbb259ec74e4fd8abca661 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Wed, 26 Mar 2025 15:14:40 +0100 Subject: [PATCH 02/13] pmd --- build.gradle | 1 - buildSrc/build.gradle | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b6e5a5344128..6dfc08b0ee81 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,6 @@ plugins { id 'io.github.goooler.shadow' version '8.1.8' apply false id 'me.champeau.jmh' version '0.7.2' apply false id "net.ltgt.errorprone" version "4.1.0" apply false - id 'k' } ext { diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 5bfe6021bf74..511f7c6c5cd3 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -1,6 +1,7 @@ plugins { id 'java-gradle-plugin' id 'checkstyle' + id 'pmd' } repositories { @@ -63,3 +64,7 @@ test { } jar.dependsOn check + +pmd { + ruleSets = ["category/java/bestpractices.xml"] +} \ No newline at end of file From adb1db24924948581874a5a93e6d71b590ca4f81 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Wed, 26 Mar 2025 19:22:20 +0100 Subject: [PATCH 03/13] bestpractices --- buildSrc/build.gradle | 8 ++++---- spring-core/spring-core.gradle | 5 +++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 511f7c6c5cd3..00019ff5de27 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java-gradle-plugin' id 'checkstyle' - id 'pmd' +// id 'pmd' } repositories { @@ -65,6 +65,6 @@ test { jar.dependsOn check -pmd { - ruleSets = ["category/java/bestpractices.xml"] -} \ No newline at end of file +//pmd { +// ruleSets = ["category/java/bestpractices.xml"] +//} \ No newline at end of file diff --git a/spring-core/spring-core.gradle b/spring-core/spring-core.gradle index 5ac17dd889dd..525ac88675ea 100644 --- a/spring-core/spring-core.gradle +++ b/spring-core/spring-core.gradle @@ -3,6 +3,7 @@ import org.springframework.build.shadow.ShadowSource plugins { id 'org.springframework.build.multiReleaseJar' + id 'pmd' } description = "Spring Core" @@ -162,3 +163,7 @@ eclipse { } tasks['eclipse'].dependsOn(javapoetRepackJar, javapoetSourceJar, objenesisRepackJar, objenesisSourceJar) + +pmd { + ruleSets = ["category/java/bestpractices.xml"] +} \ No newline at end of file From 2280b053680e6fc3bb689b6cdbbffc6332cf93c1 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Mon, 16 Jun 2025 16:38:33 +0200 Subject: [PATCH 04/13] use try-with-resources statement in ResourceRegionHttpMessageConverter Signed-off-by: Vincent Potucek --- buildSrc/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index aada8c4f11e0..a8d11db1892e 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -67,6 +67,6 @@ test { jar.dependsOn check -//pmd { -// ruleSets = ["category/java/bestpractices.xml"] -//} \ No newline at end of file +pmd { + ruleSets = ["category/java/bestpractices.xml"] +} \ No newline at end of file From f9775c2f8b542e67713e8a487e2e6c4a2e7f45d2 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Mon, 16 Jun 2025 16:41:47 +0200 Subject: [PATCH 05/13] pmd --- .pmd/ruleset.xml | 10 ++++++++++ buildSrc/build.gradle | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 .pmd/ruleset.xml diff --git a/.pmd/ruleset.xml b/.pmd/ruleset.xml new file mode 100644 index 000000000000..010597bec679 --- /dev/null +++ b/.pmd/ruleset.xml @@ -0,0 +1,10 @@ + + + Programmatic approach to maintain code quality on large scale. + + + + \ No newline at end of file diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index a8d11db1892e..d0899af21538 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java-gradle-plugin' id 'checkstyle' -// id 'pmd' + id 'pmd' } repositories { @@ -68,5 +68,5 @@ test { jar.dependsOn check pmd { - ruleSets = ["category/java/bestpractices.xml"] + ruleSetFiles = files(".pmd/ruleset.xml") } \ No newline at end of file From 8ed89f1b7073f3beffa1cd82900fc6bba6d6e351 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Mon, 16 Jun 2025 16:50:24 +0200 Subject: [PATCH 06/13] pmd --- .pmd/ruleset.xml | 1 - buildSrc/build.gradle | 4 +++- spring-core/spring-core.gradle | 5 ----- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/.pmd/ruleset.xml b/.pmd/ruleset.xml index 010597bec679..70084148d6ad 100644 --- a/.pmd/ruleset.xml +++ b/.pmd/ruleset.xml @@ -4,7 +4,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd"> Programmatic approach to maintain code quality on large scale. - \ No newline at end of file diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index d0899af21538..17fe38f44805 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -3,7 +3,9 @@ plugins { id 'checkstyle' id 'pmd' } - +subprojects { + apply plugin: 'pmd' +} repositories { mavenCentral() gradlePluginPortal() diff --git a/spring-core/spring-core.gradle b/spring-core/spring-core.gradle index 525ac88675ea..5ac17dd889dd 100644 --- a/spring-core/spring-core.gradle +++ b/spring-core/spring-core.gradle @@ -3,7 +3,6 @@ import org.springframework.build.shadow.ShadowSource plugins { id 'org.springframework.build.multiReleaseJar' - id 'pmd' } description = "Spring Core" @@ -163,7 +162,3 @@ eclipse { } tasks['eclipse'].dependsOn(javapoetRepackJar, javapoetSourceJar, objenesisRepackJar, objenesisSourceJar) - -pmd { - ruleSets = ["category/java/bestpractices.xml"] -} \ No newline at end of file From 45620e5507e4ee5ca40adbffc55fc5aa18b455e2 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Mon, 16 Jun 2025 16:55:26 +0200 Subject: [PATCH 07/13] pmd --- buildSrc/build.gradle | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 17fe38f44805..f7880773d9a6 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -3,8 +3,10 @@ plugins { id 'checkstyle' id 'pmd' } +//check.dependsOn(pmdMain) subprojects { apply plugin: 'pmd' +// check.dependsOn(pmdMain) } repositories { mavenCentral() @@ -67,8 +69,11 @@ test { useJUnitPlatform() } -jar.dependsOn check +check { + pmdMain() +} pmd { ruleSetFiles = files(".pmd/ruleset.xml") -} \ No newline at end of file +} +jar.dependsOn check From dc71d93974e3e047302ff2bdf576650cbb88f0e1 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Mon, 16 Jun 2025 17:00:28 +0200 Subject: [PATCH 08/13] pmd --- .pmd/ruleset.xml | 2 +- build.gradle | 5 +++++ buildSrc/build.gradle | 9 +-------- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/.pmd/ruleset.xml b/.pmd/ruleset.xml index 70084148d6ad..58eeaade9e9a 100644 --- a/.pmd/ruleset.xml +++ b/.pmd/ruleset.xml @@ -4,6 +4,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd"> Programmatic approach to maintain code quality on large scale. - + \ No newline at end of file diff --git a/build.gradle b/build.gradle index ba18d62245c0..c65325a098c8 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,7 @@ plugins { id 'io.github.goooler.shadow' version '8.1.8' apply false id 'me.champeau.jmh' version '0.7.2' apply false id "io.spring.nullability" version "0.0.1" apply false + id 'pmd' } ext { @@ -18,6 +19,7 @@ description = "Spring Framework" configure(allprojects) { project -> apply plugin: "org.springframework.build.localdev" + apply plugin: "pmd" group = "org.springframework" repositories { mavenCentral() @@ -34,6 +36,9 @@ configure(allprojects) { project -> cacheDynamicVersionsFor 0, "seconds" } } + pmd { + ruleSetFiles = files(".pmd/ruleset.xml") + } } configure(allprojects - project(":framework-platform")) { diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index f7880773d9a6..6292a34ed1ff 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -6,7 +6,7 @@ plugins { //check.dependsOn(pmdMain) subprojects { apply plugin: 'pmd' -// check.dependsOn(pmdMain) + check.dependsOn(pmdMain) } repositories { mavenCentral() @@ -69,11 +69,4 @@ test { useJUnitPlatform() } -check { - pmdMain() -} - -pmd { - ruleSetFiles = files(".pmd/ruleset.xml") -} jar.dependsOn check From a31d777a68f6c15e8bd2e04187cc912a047bed3d Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Mon, 16 Jun 2025 17:01:03 +0200 Subject: [PATCH 09/13] pmd --- .pmd/ruleset.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.pmd/ruleset.xml b/.pmd/ruleset.xml index 58eeaade9e9a..304df6db94f9 100644 --- a/.pmd/ruleset.xml +++ b/.pmd/ruleset.xml @@ -6,4 +6,6 @@ Programmatic approach to maintain code quality on large scale. + + \ No newline at end of file From ae1d228f958e0a7df1fedc14af7b58a71e1d607c Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Mon, 16 Jun 2025 17:05:05 +0200 Subject: [PATCH 10/13] pmd --- .pmd/ruleset.xml | 29 ++++++++++++++++++++++++++--- build.gradle | 2 ++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/.pmd/ruleset.xml b/.pmd/ruleset.xml index 304df6db94f9..12e19d5f049c 100644 --- a/.pmd/ruleset.xml +++ b/.pmd/ruleset.xml @@ -4,8 +4,31 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd"> Programmatic approach to maintain code quality on large scale. - - + + + + + + + + + + + + + + + + + + + + + + + + - + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index c65325a098c8..10afc51ed55a 100644 --- a/build.gradle +++ b/build.gradle @@ -38,6 +38,8 @@ configure(allprojects) { project -> } pmd { ruleSetFiles = files(".pmd/ruleset.xml") +// ruleSets = ["category/java/errorprone.xml"] +// ruleSets = ["category/java/errorprone.xml", "category/java/bestpractices.xml"] } } From f60b580c9ff7f16371042b8bad58987ccc3faf86 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Mon, 16 Jun 2025 17:13:11 +0200 Subject: [PATCH 11/13] pmd --- .pmd/ruleset.xml | 3 +++ build.gradle | 2 -- .../multirelease/MultiReleaseJarPlugin.java | 1 + .../ConcurrentOperationExecutor.java | 1 + .../jdbccomplextypes/SqlTypeValueFactory.java | 2 ++ .../jms/jmsreceivingasync/ExampleListener.java | 1 + .../TaskExecutorExample.java | 1 + .../mvcconfigadvancedxml/MyPostProcessor.java | 1 + .../DelegatingIntroductionInterceptor.java | 2 +- .../aop/support/AopUtilsTests.java | 1 + .../config/JCacheCustomInterceptorTests.java | 1 + .../cache/config/CustomInterceptorTests.java | 1 + .../ConfigurationClassEnhancerTests.java | 1 + .../task/support/ExecutorServiceAdapter.java | 1 + .../expression/ExpressionException.java | 1 + .../messaging/protobuf/Msg.java | 18 ++++++++++++------ .../hibernate5/LocalSessionFactoryBuilder.java | 1 + .../mock/web/MockHttpServletResponse.java | 1 + .../reactive/JdkResponseCookieParser.java | 1 + .../web/accept/DefaultApiVersionStrategy.java | 1 + .../DefaultApiVersionInserterBuilder.java | 5 +++++ .../async/StandardServletAsyncWebRequest.java | 1 + .../java/org/springframework/protobuf/Msg.java | 18 ++++++++++++------ ...estClientProxyRegistryIntegrationTests.java | 1 + .../servlet/MockHttpServletResponse.java | 1 + .../accept/DefaultApiVersionStrategy.java | 1 + .../web/reactive/protobuf/Msg.java | 18 ++++++++++++------ .../servlet/function/DefaultServerRequest.java | 1 + .../handler/HandlerMappingIntrospector.java | 1 + 29 files changed, 68 insertions(+), 21 deletions(-) diff --git a/.pmd/ruleset.xml b/.pmd/ruleset.xml index 12e19d5f049c..4b380983d95e 100644 --- a/.pmd/ruleset.xml +++ b/.pmd/ruleset.xml @@ -26,9 +26,12 @@ + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 10afc51ed55a..c65325a098c8 100644 --- a/build.gradle +++ b/build.gradle @@ -38,8 +38,6 @@ configure(allprojects) { project -> } pmd { ruleSetFiles = files(".pmd/ruleset.xml") -// ruleSets = ["category/java/errorprone.xml"] -// ruleSets = ["category/java/errorprone.xml", "category/java/bestpractices.xml"] } } diff --git a/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseJarPlugin.java b/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseJarPlugin.java index 1716d016b285..2002e4d427ad 100644 --- a/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseJarPlugin.java +++ b/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseJarPlugin.java @@ -43,6 +43,7 @@ protected JavaToolchainService getToolchains() { throw new UnsupportedOperationException(); } + @Override public void apply(Project project) { project.getPlugins().apply(JavaPlugin.class); ExtensionContainer extensions = project.getExtensions(); diff --git a/framework-docs/src/main/java/org/springframework/docs/core/aop/ataspectj/aopataspectjexample/ConcurrentOperationExecutor.java b/framework-docs/src/main/java/org/springframework/docs/core/aop/ataspectj/aopataspectjexample/ConcurrentOperationExecutor.java index a760f744918f..ec8be0f8ce4d 100644 --- a/framework-docs/src/main/java/org/springframework/docs/core/aop/ataspectj/aopataspectjexample/ConcurrentOperationExecutor.java +++ b/framework-docs/src/main/java/org/springframework/docs/core/aop/ataspectj/aopataspectjexample/ConcurrentOperationExecutor.java @@ -36,6 +36,7 @@ public void setMaxRetries(int maxRetries) { this.maxRetries = maxRetries; } + @Override public int getOrder() { return this.order; } diff --git a/framework-docs/src/main/java/org/springframework/docs/dataaccess/jdbc/jdbccomplextypes/SqlTypeValueFactory.java b/framework-docs/src/main/java/org/springframework/docs/dataaccess/jdbc/jdbccomplextypes/SqlTypeValueFactory.java index bdcfc4b23233..5c4ebf92602d 100644 --- a/framework-docs/src/main/java/org/springframework/docs/dataaccess/jdbc/jdbccomplextypes/SqlTypeValueFactory.java +++ b/framework-docs/src/main/java/org/springframework/docs/dataaccess/jdbc/jdbccomplextypes/SqlTypeValueFactory.java @@ -35,6 +35,7 @@ void createStructSample() throws ParseException { new SimpleDateFormat("yyyy-M-d").parse("2010-12-31")); SqlTypeValue value = new AbstractSqlTypeValue() { + @Override protected Object createTypeValue(Connection connection, int sqlType, String typeName) throws SQLException { Object[] item = new Object[] { testItem.getId(), testItem.getDescription(), new java.sql.Date(testItem.getExpirationDate().getTime()) }; @@ -49,6 +50,7 @@ void createOracleArray() { Long[] ids = new Long[] {1L, 2L}; SqlTypeValue value = new AbstractSqlTypeValue() { + @Override protected Object createTypeValue(Connection conn, int sqlType, String typeName) throws SQLException { return conn.unwrap(OracleConnection.class).createOracleArray(typeName, ids); } diff --git a/framework-docs/src/main/java/org/springframework/docs/integration/jms/jmsreceivingasync/ExampleListener.java b/framework-docs/src/main/java/org/springframework/docs/integration/jms/jmsreceivingasync/ExampleListener.java index d535f8cb0811..aff92b1943ec 100644 --- a/framework-docs/src/main/java/org/springframework/docs/integration/jms/jmsreceivingasync/ExampleListener.java +++ b/framework-docs/src/main/java/org/springframework/docs/integration/jms/jmsreceivingasync/ExampleListener.java @@ -24,6 +24,7 @@ // tag::snippet[] public class ExampleListener implements MessageListener { + @Override public void onMessage(Message message) { if (message instanceof TextMessage textMessage) { try { diff --git a/framework-docs/src/main/java/org/springframework/docs/integration/schedulingtaskexecutorusage/TaskExecutorExample.java b/framework-docs/src/main/java/org/springframework/docs/integration/schedulingtaskexecutorusage/TaskExecutorExample.java index 62a156cff177..ca738cb0b91c 100644 --- a/framework-docs/src/main/java/org/springframework/docs/integration/schedulingtaskexecutorusage/TaskExecutorExample.java +++ b/framework-docs/src/main/java/org/springframework/docs/integration/schedulingtaskexecutorusage/TaskExecutorExample.java @@ -30,6 +30,7 @@ public MessagePrinterTask(String message) { this.message = message; } + @Override public void run() { System.out.println(message); } diff --git a/framework-docs/src/main/java/org/springframework/docs/web/webmvc/mvcconfig/mvcconfigadvancedxml/MyPostProcessor.java b/framework-docs/src/main/java/org/springframework/docs/web/webmvc/mvcconfig/mvcconfigadvancedxml/MyPostProcessor.java index f3649e9accdb..112e62ad4c38 100644 --- a/framework-docs/src/main/java/org/springframework/docs/web/webmvc/mvcconfig/mvcconfigadvancedxml/MyPostProcessor.java +++ b/framework-docs/src/main/java/org/springframework/docs/web/webmvc/mvcconfig/mvcconfigadvancedxml/MyPostProcessor.java @@ -24,6 +24,7 @@ @Component public class MyPostProcessor implements BeanPostProcessor { + @Override public Object postProcessBeforeInitialization(Object bean, String name) throws BeansException { // ... return bean; diff --git a/spring-aop/src/main/java/org/springframework/aop/support/DelegatingIntroductionInterceptor.java b/spring-aop/src/main/java/org/springframework/aop/support/DelegatingIntroductionInterceptor.java index 1948ef564702..b61bad261b2c 100644 --- a/spring-aop/src/main/java/org/springframework/aop/support/DelegatingIntroductionInterceptor.java +++ b/spring-aop/src/main/java/org/springframework/aop/support/DelegatingIntroductionInterceptor.java @@ -110,7 +110,7 @@ private void init(Object delegate) { // Massage return value if possible: if the delegate returned itself, // we really want to return the proxy. - if (retVal == this.delegate && mi instanceof ProxyMethodInvocation pmi) { + if (retVal.equals(this.delegate) && mi instanceof ProxyMethodInvocation pmi) { Object proxy = pmi.getProxy(); if (mi.getMethod().getReturnType().isInstance(proxy)) { retVal = proxy; diff --git a/spring-aop/src/test/java/org/springframework/aop/support/AopUtilsTests.java b/spring-aop/src/test/java/org/springframework/aop/support/AopUtilsTests.java index 5da2f556be4e..2c2901e772cf 100644 --- a/spring-aop/src/test/java/org/springframework/aop/support/AopUtilsTests.java +++ b/spring-aop/src/test/java/org/springframework/aop/support/AopUtilsTests.java @@ -125,6 +125,7 @@ interface ProxyInterface { static class WithInterface implements ProxyInterface { + @Override public void handle(List list) { } } diff --git a/spring-context-support/src/test/java/org/springframework/cache/jcache/config/JCacheCustomInterceptorTests.java b/spring-context-support/src/test/java/org/springframework/cache/jcache/config/JCacheCustomInterceptorTests.java index 8cc2254b1554..33193d9d72e6 100644 --- a/spring-context-support/src/test/java/org/springframework/cache/jcache/config/JCacheCustomInterceptorTests.java +++ b/spring-context-support/src/test/java/org/springframework/cache/jcache/config/JCacheCustomInterceptorTests.java @@ -137,6 +137,7 @@ static class CacheInterceptorBeanPostProcessor implements BeanPostProcessor { CacheInterceptorBeanPostProcessor(BeanFactory beanFactory) {this.beanFactory = beanFactory;} + @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (beanName.equals("jCacheInterceptor")) { JCacheInterceptor cacheInterceptor = new TestCacheInterceptor(); diff --git a/spring-context/src/test/java/org/springframework/cache/config/CustomInterceptorTests.java b/spring-context/src/test/java/org/springframework/cache/config/CustomInterceptorTests.java index 9421d5a1cd5b..06787ba53fac 100644 --- a/spring-context/src/test/java/org/springframework/cache/config/CustomInterceptorTests.java +++ b/spring-context/src/test/java/org/springframework/cache/config/CustomInterceptorTests.java @@ -115,6 +115,7 @@ static class CacheInterceptorBeanPostProcessor implements BeanPostProcessor { CacheInterceptorBeanPostProcessor(BeanFactory beanFactory) {this.beanFactory = beanFactory;} + @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (beanName.equals("cacheInterceptor")) { CacheInterceptor cacheInterceptor = new TestCacheInterceptor(); diff --git a/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassEnhancerTests.java b/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassEnhancerTests.java index ff801346c764..1bfb80623d29 100644 --- a/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassEnhancerTests.java +++ b/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassEnhancerTests.java @@ -214,6 +214,7 @@ static class CustomSmartClassLoader extends SecureClassLoader implements SmartCl super(parent); } + @Override protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { if (name.contains("MyConfig")) { String path = name.replace('.', '/').concat(".class"); diff --git a/spring-core/src/main/java/org/springframework/core/task/support/ExecutorServiceAdapter.java b/spring-core/src/main/java/org/springframework/core/task/support/ExecutorServiceAdapter.java index e1860006a5eb..9e0c8303701c 100644 --- a/spring-core/src/main/java/org/springframework/core/task/support/ExecutorServiceAdapter.java +++ b/spring-core/src/main/java/org/springframework/core/task/support/ExecutorServiceAdapter.java @@ -91,6 +91,7 @@ public boolean isTerminated() { } // @Override on JDK 19 + @Override public void close() { // no-op in order to avoid container-triggered shutdown call which would lead to exception logging } diff --git a/spring-expression/src/main/java/org/springframework/expression/ExpressionException.java b/spring-expression/src/main/java/org/springframework/expression/ExpressionException.java index 7ee2ae06d4f0..d6a625d5b349 100644 --- a/spring-expression/src/main/java/org/springframework/expression/ExpressionException.java +++ b/spring-expression/src/main/java/org/springframework/expression/ExpressionException.java @@ -121,6 +121,7 @@ public final int getPosition() { * @see #getSimpleMessage() * @see java.lang.Throwable#getMessage() */ + @Override public String getMessage() { return toDetailedString(); } diff --git a/spring-messaging/src/test/java/org/springframework/messaging/protobuf/Msg.java b/spring-messaging/src/test/java/org/springframework/messaging/protobuf/Msg.java index a7e43397b437..a847af872a9d 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/protobuf/Msg.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/protobuf/Msg.java @@ -469,14 +469,16 @@ public Builder mergeFrom( * optional string foo = 1; * @return Whether the foo field is set. */ - public boolean hasFoo() { + @Override + public boolean hasFoo() { return ((bitField0_ & 0x00000001) != 0); } /** * optional string foo = 1; * @return The foo. */ - public java.lang.String getFoo() { + @Override + public java.lang.String getFoo() { java.lang.Object ref = foo_; if (!(ref instanceof java.lang.String)) { com.google.protobuf.ByteString bs = @@ -494,7 +496,8 @@ public java.lang.String getFoo() { * optional string foo = 1; * @return The bytes for foo. */ - public com.google.protobuf.ByteString + @Override + public com.google.protobuf.ByteString getFooBytes() { java.lang.Object ref = foo_; if (ref instanceof String) { @@ -551,14 +554,16 @@ public Builder setFooBytes( * optional .SecondMsg blah = 2; * @return Whether the blah field is set. */ - public boolean hasBlah() { + @Override + public boolean hasBlah() { return ((bitField0_ & 0x00000002) != 0); } /** * optional .SecondMsg blah = 2; * @return The blah. */ - public org.springframework.messaging.protobuf.SecondMsg getBlah() { + @Override + public org.springframework.messaging.protobuf.SecondMsg getBlah() { if (blahBuilder_ == null) { return blah_ == null ? org.springframework.messaging.protobuf.SecondMsg.getDefaultInstance() : blah_; } else { @@ -640,7 +645,8 @@ public org.springframework.messaging.protobuf.SecondMsg.Builder getBlahBuilder() /** * optional .SecondMsg blah = 2; */ - public org.springframework.messaging.protobuf.SecondMsgOrBuilder getBlahOrBuilder() { + @Override + public org.springframework.messaging.protobuf.SecondMsgOrBuilder getBlahOrBuilder() { if (blahBuilder_ != null) { return blahBuilder_.getMessageOrBuilder(); } else { diff --git a/spring-orm/src/main/java/org/springframework/orm/hibernate5/LocalSessionFactoryBuilder.java b/spring-orm/src/main/java/org/springframework/orm/hibernate5/LocalSessionFactoryBuilder.java index e134589b6cb6..03b7cfdda84e 100644 --- a/spring-orm/src/main/java/org/springframework/orm/hibernate5/LocalSessionFactoryBuilder.java +++ b/spring-orm/src/main/java/org/springframework/orm/hibernate5/LocalSessionFactoryBuilder.java @@ -289,6 +289,7 @@ public LocalSessionFactoryBuilder setEntityTypeFilters(TypeFilter... entityTypeF * @see #addPackage * @see #scanPackages */ + @Override public LocalSessionFactoryBuilder addPackages(String... annotatedPackages) { for (String annotatedPackage : annotatedPackages) { addPackage(annotatedPackage); diff --git a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java index 95bc2551b8e1..5f5102772384 100644 --- a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java +++ b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java @@ -643,6 +643,7 @@ public void sendRedirect(String url) throws IOException { } // @Override - on Servlet 6.1 + @Override public void sendRedirect(String url, int sc, boolean clearBuffer) throws IOException { Assert.state(!isCommitted(), "Cannot send redirect - response is already committed"); Assert.notNull(url, "Redirect URL must not be null"); diff --git a/spring-web/src/main/java/org/springframework/http/client/reactive/JdkResponseCookieParser.java b/spring-web/src/main/java/org/springframework/http/client/reactive/JdkResponseCookieParser.java index dca1b0528c55..dd8d3d219dc7 100644 --- a/spring-web/src/main/java/org/springframework/http/client/reactive/JdkResponseCookieParser.java +++ b/spring-web/src/main/java/org/springframework/http/client/reactive/JdkResponseCookieParser.java @@ -39,6 +39,7 @@ final class JdkResponseCookieParser implements ResponseCookie.Parser { /** * Parse the given headers. */ + @Override public List parse(String header) { Matcher matcher = SAME_SITE_PATTERN.matcher(header); String sameSite = (matcher.matches() ? matcher.group(1) : null); diff --git a/spring-web/src/main/java/org/springframework/web/accept/DefaultApiVersionStrategy.java b/spring-web/src/main/java/org/springframework/web/accept/DefaultApiVersionStrategy.java index 752dfa5261b5..a98c845c5772 100644 --- a/spring-web/src/main/java/org/springframework/web/accept/DefaultApiVersionStrategy.java +++ b/spring-web/src/main/java/org/springframework/web/accept/DefaultApiVersionStrategy.java @@ -105,6 +105,7 @@ public Comparable parseVersion(String version) { return this.versionParser.parseVersion(version); } + @Override public void validateVersion(@Nullable Comparable requestVersion, HttpServletRequest request) throws MissingApiVersionException, InvalidApiVersionException { diff --git a/spring-web/src/main/java/org/springframework/web/client/DefaultApiVersionInserterBuilder.java b/spring-web/src/main/java/org/springframework/web/client/DefaultApiVersionInserterBuilder.java index 92b574672380..f4b26112a1a1 100644 --- a/spring-web/src/main/java/org/springframework/web/client/DefaultApiVersionInserterBuilder.java +++ b/spring-web/src/main/java/org/springframework/web/client/DefaultApiVersionInserterBuilder.java @@ -50,6 +50,7 @@ final class DefaultApiVersionInserterBuilder implements ApiVersionInserter.Build * Configure the inserter to set a header. * @param header the name of the header to hold the version */ + @Override public ApiVersionInserter.Builder useHeader(@Nullable String header) { this.header = header; return this; @@ -59,6 +60,7 @@ public ApiVersionInserter.Builder useHeader(@Nullable String header) { * Configure the inserter to set a query parameter. * @param queryParam the name of the query parameter to hold the version */ + @Override public ApiVersionInserter.Builder useQueryParam(@Nullable String queryParam) { this.queryParam = queryParam; return this; @@ -68,6 +70,7 @@ public ApiVersionInserter.Builder useQueryParam(@Nullable String queryParam) { * Configure the inserter to insert a path segment. * @param pathSegmentIndex the index of the path segment to hold the version */ + @Override public ApiVersionInserter.Builder usePathSegment(@Nullable Integer pathSegmentIndex) { this.pathSegmentIndex = pathSegmentIndex; return this; @@ -78,6 +81,7 @@ public ApiVersionInserter.Builder usePathSegment(@Nullable Integer pathSegmentIn *

By default, the version is formatted with {@link Object#toString()}. * @param versionFormatter the formatter to use */ + @Override public ApiVersionInserter.Builder withVersionFormatter(ApiVersionFormatter versionFormatter) { this.versionFormatter = versionFormatter; return this; @@ -86,6 +90,7 @@ public ApiVersionInserter.Builder withVersionFormatter(ApiVersionFormatter versi /** * Build the inserter. */ + @Override public ApiVersionInserter build() { return new DefaultApiVersionInserter( this.header, this.queryParam, this.pathSegmentIndex, this.versionFormatter); diff --git a/spring-web/src/main/java/org/springframework/web/context/request/async/StandardServletAsyncWebRequest.java b/spring-web/src/main/java/org/springframework/web/context/request/async/StandardServletAsyncWebRequest.java index a8e731dbb2fb..245c0751f7d2 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/async/StandardServletAsyncWebRequest.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/async/StandardServletAsyncWebRequest.java @@ -389,6 +389,7 @@ public void write(int b) throws IOException { } } + @Override public void write(byte[] buf, int offset, int len) throws IOException { int level = this.response.obtainLockOrRaiseException(); try { diff --git a/spring-web/src/test/java/org/springframework/protobuf/Msg.java b/spring-web/src/test/java/org/springframework/protobuf/Msg.java index e47b4738e7e7..dd729ce3f186 100644 --- a/spring-web/src/test/java/org/springframework/protobuf/Msg.java +++ b/spring-web/src/test/java/org/springframework/protobuf/Msg.java @@ -469,14 +469,16 @@ public Builder mergeFrom( * optional string foo = 1; * @return Whether the foo field is set. */ - public boolean hasFoo() { + @Override + public boolean hasFoo() { return ((bitField0_ & 0x00000001) != 0); } /** * optional string foo = 1; * @return The foo. */ - public java.lang.String getFoo() { + @Override + public java.lang.String getFoo() { java.lang.Object ref = foo_; if (!(ref instanceof java.lang.String)) { com.google.protobuf.ByteString bs = @@ -494,7 +496,8 @@ public java.lang.String getFoo() { * optional string foo = 1; * @return The bytes for foo. */ - public com.google.protobuf.ByteString + @Override + public com.google.protobuf.ByteString getFooBytes() { java.lang.Object ref = foo_; if (ref instanceof String) { @@ -551,14 +554,16 @@ public Builder setFooBytes( * optional .SecondMsg blah = 2; * @return Whether the blah field is set. */ - public boolean hasBlah() { + @Override + public boolean hasBlah() { return ((bitField0_ & 0x00000002) != 0); } /** * optional .SecondMsg blah = 2; * @return The blah. */ - public org.springframework.protobuf.SecondMsg getBlah() { + @Override + public org.springframework.protobuf.SecondMsg getBlah() { if (blahBuilder_ == null) { return blah_ == null ? org.springframework.protobuf.SecondMsg.getDefaultInstance() : blah_; } else { @@ -640,7 +645,8 @@ public org.springframework.protobuf.SecondMsg.Builder getBlahBuilder() { /** * optional .SecondMsg blah = 2; */ - public org.springframework.protobuf.SecondMsgOrBuilder getBlahOrBuilder() { + @Override + public org.springframework.protobuf.SecondMsgOrBuilder getBlahOrBuilder() { if (blahBuilder_ != null) { return blahBuilder_.getMessageOrBuilder(); } else { diff --git a/spring-web/src/test/java/org/springframework/web/client/support/RestClientProxyRegistryIntegrationTests.java b/spring-web/src/test/java/org/springframework/web/client/support/RestClientProxyRegistryIntegrationTests.java index e867fe902c92..3621c32f678c 100644 --- a/spring-web/src/test/java/org/springframework/web/client/support/RestClientProxyRegistryIntegrationTests.java +++ b/spring-web/src/test/java/org/springframework/web/client/support/RestClientProxyRegistryIntegrationTests.java @@ -119,6 +119,7 @@ void basic(Class configClass) throws InterruptedException { void beansAreCreatedUsingBeanClassLoader() { ClassLoader beanClassLoader = new OverridingClassLoader(getClass().getClassLoader()) { + @Override protected boolean isEligibleForOverriding(String className) { return className.contains("EchoA"); }; diff --git a/spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockHttpServletResponse.java b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockHttpServletResponse.java index 9519dafc9d36..1a1d91e45979 100644 --- a/spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockHttpServletResponse.java +++ b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockHttpServletResponse.java @@ -643,6 +643,7 @@ public void sendRedirect(String url) throws IOException { } // @Override - on Servlet 6.1 + @Override public void sendRedirect(String url, int sc, boolean clearBuffer) throws IOException { Assert.state(!isCommitted(), "Cannot send redirect - response is already committed"); Assert.notNull(url, "Redirect URL must not be null"); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/accept/DefaultApiVersionStrategy.java b/spring-webflux/src/main/java/org/springframework/web/reactive/accept/DefaultApiVersionStrategy.java index 91ce69855cbe..ab42ec234c58 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/accept/DefaultApiVersionStrategy.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/accept/DefaultApiVersionStrategy.java @@ -135,6 +135,7 @@ public Comparable parseVersion(String version) { return this.versionParser.parseVersion(version); } + @Override public void validateVersion(@Nullable Comparable requestVersion, ServerWebExchange exchange) throws MissingApiVersionException, InvalidApiVersionException { diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/protobuf/Msg.java b/spring-webflux/src/test/java/org/springframework/web/reactive/protobuf/Msg.java index 5c0b1b9d1d41..f3dea92df11c 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/protobuf/Msg.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/protobuf/Msg.java @@ -469,14 +469,16 @@ public Builder mergeFrom( * optional string foo = 1; * @return Whether the foo field is set. */ - public boolean hasFoo() { + @Override + public boolean hasFoo() { return ((bitField0_ & 0x00000001) != 0); } /** * optional string foo = 1; * @return The foo. */ - public java.lang.String getFoo() { + @Override + public java.lang.String getFoo() { java.lang.Object ref = foo_; if (!(ref instanceof java.lang.String)) { com.google.protobuf.ByteString bs = @@ -494,7 +496,8 @@ public java.lang.String getFoo() { * optional string foo = 1; * @return The bytes for foo. */ - public com.google.protobuf.ByteString + @Override + public com.google.protobuf.ByteString getFooBytes() { java.lang.Object ref = foo_; if (ref instanceof String) { @@ -551,14 +554,16 @@ public Builder setFooBytes( * optional .SecondMsg blah = 2; * @return Whether the blah field is set. */ - public boolean hasBlah() { + @Override + public boolean hasBlah() { return ((bitField0_ & 0x00000002) != 0); } /** * optional .SecondMsg blah = 2; * @return The blah. */ - public org.springframework.web.reactive.protobuf.SecondMsg getBlah() { + @Override + public org.springframework.web.reactive.protobuf.SecondMsg getBlah() { if (blahBuilder_ == null) { return blah_ == null ? org.springframework.web.reactive.protobuf.SecondMsg.getDefaultInstance() : blah_; } else { @@ -640,7 +645,8 @@ public org.springframework.web.reactive.protobuf.SecondMsg.Builder getBlahBuilde /** * optional .SecondMsg blah = 2; */ - public org.springframework.web.reactive.protobuf.SecondMsgOrBuilder getBlahOrBuilder() { + @Override + public org.springframework.web.reactive.protobuf.SecondMsgOrBuilder getBlahOrBuilder() { if (blahBuilder_ != null) { return blahBuilder_.getMessageOrBuilder(); } else { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultServerRequest.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultServerRequest.java index 96017c00bc0d..7c42479f8226 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultServerRequest.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultServerRequest.java @@ -678,6 +678,7 @@ public void sendRedirect(String location) throws IOException { } // @Override - on Servlet 6.1 + @Override public void sendRedirect(String location, int sc, boolean clearBuffer) throws IOException { throw new UnsupportedOperationException(); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/HandlerMappingIntrospector.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/HandlerMappingIntrospector.java index 25eeec851aa4..aab6da66889d 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/HandlerMappingIntrospector.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/HandlerMappingIntrospector.java @@ -222,6 +222,7 @@ public boolean allHandlerMappingsUsePathPatternParser() { * @throws NoHandlerFoundException if no handler matches the request * @since 6.2 */ + @Override public void handlePreFlight(HttpServletRequest request, HttpServletResponse response) throws Exception { Assert.state(this.handlerMappings != null, "Not yet initialized via afterPropertiesSet."); Assert.state(CorsUtils.isPreFlightRequest(request), "Not a pre-flight request."); From 66541e0067a8a67d8492a2d3321a669c68b0c005 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Mon, 16 Jun 2025 17:15:21 +0200 Subject: [PATCH 12/13] pmd --- buildSrc/build.gradle | 7 +------ .../aop/support/DelegatingIntroductionInterceptor.java | 4 +++- .../core/task/support/ExecutorServiceAdapter.java | 1 - 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 6292a34ed1ff..7d0027111ba2 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -1,13 +1,8 @@ plugins { id 'java-gradle-plugin' id 'checkstyle' - id 'pmd' -} -//check.dependsOn(pmdMain) -subprojects { - apply plugin: 'pmd' - check.dependsOn(pmdMain) } + repositories { mavenCentral() gradlePluginPortal() diff --git a/spring-aop/src/main/java/org/springframework/aop/support/DelegatingIntroductionInterceptor.java b/spring-aop/src/main/java/org/springframework/aop/support/DelegatingIntroductionInterceptor.java index b61bad261b2c..40d4d014100a 100644 --- a/spring-aop/src/main/java/org/springframework/aop/support/DelegatingIntroductionInterceptor.java +++ b/spring-aop/src/main/java/org/springframework/aop/support/DelegatingIntroductionInterceptor.java @@ -24,6 +24,8 @@ import org.springframework.aop.ProxyMethodInvocation; import org.springframework.util.Assert; +import static java.util.Objects.requireNonNull; + /** * Convenient implementation of the * {@link org.springframework.aop.IntroductionInterceptor} interface. @@ -110,7 +112,7 @@ private void init(Object delegate) { // Massage return value if possible: if the delegate returned itself, // we really want to return the proxy. - if (retVal.equals(this.delegate) && mi instanceof ProxyMethodInvocation pmi) { + if (requireNonNull(retVal).equals(this.delegate) && mi instanceof ProxyMethodInvocation pmi) { Object proxy = pmi.getProxy(); if (mi.getMethod().getReturnType().isInstance(proxy)) { retVal = proxy; diff --git a/spring-core/src/main/java/org/springframework/core/task/support/ExecutorServiceAdapter.java b/spring-core/src/main/java/org/springframework/core/task/support/ExecutorServiceAdapter.java index 9e0c8303701c..e1860006a5eb 100644 --- a/spring-core/src/main/java/org/springframework/core/task/support/ExecutorServiceAdapter.java +++ b/spring-core/src/main/java/org/springframework/core/task/support/ExecutorServiceAdapter.java @@ -91,7 +91,6 @@ public boolean isTerminated() { } // @Override on JDK 19 - @Override public void close() { // no-op in order to avoid container-triggered shutdown call which would lead to exception logging } From 3e0e28f70696a4a45df263abc7aef9d5fa5d0e7f Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Mon, 16 Jun 2025 17:19:11 +0200 Subject: [PATCH 13/13] pmd --- .../aop/support/DelegatingIntroductionInterceptor.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/spring-aop/src/main/java/org/springframework/aop/support/DelegatingIntroductionInterceptor.java b/spring-aop/src/main/java/org/springframework/aop/support/DelegatingIntroductionInterceptor.java index 40d4d014100a..478201c59a23 100644 --- a/spring-aop/src/main/java/org/springframework/aop/support/DelegatingIntroductionInterceptor.java +++ b/spring-aop/src/main/java/org/springframework/aop/support/DelegatingIntroductionInterceptor.java @@ -18,13 +18,12 @@ import org.aopalliance.intercept.MethodInvocation; import org.jspecify.annotations.Nullable; - import org.springframework.aop.DynamicIntroductionAdvice; import org.springframework.aop.IntroductionInterceptor; import org.springframework.aop.ProxyMethodInvocation; import org.springframework.util.Assert; -import static java.util.Objects.requireNonNull; +import java.util.Objects; /** * Convenient implementation of the @@ -112,7 +111,7 @@ private void init(Object delegate) { // Massage return value if possible: if the delegate returned itself, // we really want to return the proxy. - if (requireNonNull(retVal).equals(this.delegate) && mi instanceof ProxyMethodInvocation pmi) { + if (Objects.requireNonNull(retVal).equals(this.delegate) && mi instanceof ProxyMethodInvocation pmi) { Object proxy = pmi.getProxy(); if (mi.getMethod().getReturnType().isInstance(proxy)) { retVal = proxy;