From a8131552876623339444530c20a4305444009415 Mon Sep 17 00:00:00 2001 From: Glenn Renfro Date: Wed, 10 Sep 2025 11:53:07 -0400 Subject: [PATCH 1/4] GH-10083: Add Nullability to support.management --- .../org/springframework/integration/dsl/RouterSpec.java | 3 ++- .../support/management/ControlBusCommandRegistry.java | 6 ++++-- .../integration/support/management/package-info.java | 1 + .../integration/http/management/ControlBusController.java | 3 ++- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/dsl/RouterSpec.java b/spring-integration-core/src/main/java/org/springframework/integration/dsl/RouterSpec.java index d69f106317a..8d4d74f3e20 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/dsl/RouterSpec.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/dsl/RouterSpec.java @@ -40,6 +40,7 @@ * * @author Artem Bilan * @author Gary Russell + * @author Glenn Renfro * * @since 5.0 */ @@ -273,7 +274,7 @@ else if (conversionService.canConvert(key.getClass(), String.class)) { throw new MessagingException("Unsupported channel mapping type for router [" + key.getClass() + "]"); } - + Assert.notNull(channelKey, "'channelKey' must not be null"); this.router.setChannelMapping(channelKey, entry.getValue().getComponentName()); } } diff --git a/spring-integration-core/src/main/java/org/springframework/integration/support/management/ControlBusCommandRegistry.java b/spring-integration-core/src/main/java/org/springframework/integration/support/management/ControlBusCommandRegistry.java index e73829ba100..4e024606431 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/support/management/ControlBusCommandRegistry.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/support/management/ControlBusCommandRegistry.java @@ -29,6 +29,8 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; +import org.jspecify.annotations.Nullable; + import org.springframework.beans.BeansException; import org.springframework.beans.factory.SmartInitializingSingleton; import org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor; @@ -300,7 +302,7 @@ public static final class CommandMethod { private final Class[] parameterTypes; - private String description; + private @Nullable String description; private CommandMethod(String beanName, String methodName, Class[] parameterTypes) { this.beanName = beanName; @@ -320,7 +322,7 @@ public Class[] getParameterTypes() { return this.parameterTypes; } - public String getDescription() { + public @Nullable String getDescription() { return this.description; } diff --git a/spring-integration-core/src/main/java/org/springframework/integration/support/management/package-info.java b/spring-integration-core/src/main/java/org/springframework/integration/support/management/package-info.java index 7ebb413ae8e..9d492394e88 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/support/management/package-info.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/support/management/package-info.java @@ -1,4 +1,5 @@ /** * Provides classes related to management support. */ +@org.jspecify.annotations.NullMarked package org.springframework.integration.support.management; diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/management/ControlBusController.java b/spring-integration-http/src/main/java/org/springframework/integration/http/management/ControlBusController.java index 00d7c20ec43..ab47e89f815 100644 --- a/spring-integration-http/src/main/java/org/springframework/integration/http/management/ControlBusController.java +++ b/spring-integration-http/src/main/java/org/springframework/integration/http/management/ControlBusController.java @@ -43,6 +43,7 @@ * The REST Controller to provide the management API for Control Bus pattern. * * @author Artem Bilan + * @author Glenn Renfro * * @since 6.4 */ @@ -132,7 +133,7 @@ public record ControlBusBean(String beanName, List commands) } - public record ControlBusCommand(String command, String description, List> parameterTypes) { + public record ControlBusCommand(String command, @Nullable String description, List> parameterTypes) { } From 5ad806204d61d21036a75dc30b6b151171554728 Mon Sep 17 00:00:00 2001 From: Glenn Renfro Date: Wed, 10 Sep 2025 16:44:19 -0400 Subject: [PATCH 2/4] Description is not nullable after init --- .../support/management/ControlBusCommandRegistry.java | 7 +++---- .../integration/http/management/ControlBusController.java | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/support/management/ControlBusCommandRegistry.java b/spring-integration-core/src/main/java/org/springframework/integration/support/management/ControlBusCommandRegistry.java index 4e024606431..598fed871e3 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/support/management/ControlBusCommandRegistry.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/support/management/ControlBusCommandRegistry.java @@ -29,8 +29,6 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; -import org.jspecify.annotations.Nullable; - import org.springframework.beans.BeansException; import org.springframework.beans.factory.SmartInitializingSingleton; import org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor; @@ -302,7 +300,8 @@ public static final class CommandMethod { private final Class[] parameterTypes; - private @Nullable String description; + @SuppressWarnings("NullAway.Init") + private String description; private CommandMethod(String beanName, String methodName, Class[] parameterTypes) { this.beanName = beanName; @@ -322,7 +321,7 @@ public Class[] getParameterTypes() { return this.parameterTypes; } - public @Nullable String getDescription() { + public String getDescription() { return this.description; } diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/management/ControlBusController.java b/spring-integration-http/src/main/java/org/springframework/integration/http/management/ControlBusController.java index ab47e89f815..722a78366a0 100644 --- a/spring-integration-http/src/main/java/org/springframework/integration/http/management/ControlBusController.java +++ b/spring-integration-http/src/main/java/org/springframework/integration/http/management/ControlBusController.java @@ -133,7 +133,7 @@ public record ControlBusBean(String beanName, List commands) } - public record ControlBusCommand(String command, @Nullable String description, List> parameterTypes) { + public record ControlBusCommand(String command, String description, List> parameterTypes) { } From 930ff8362457bb719147f0dda5021d04fb3ee551 Mon Sep 17 00:00:00 2001 From: Glenn Renfro Date: Wed, 10 Sep 2025 18:29:39 -0400 Subject: [PATCH 3/4] Remove unnecessary author tag --- .../integration/http/management/ControlBusController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/management/ControlBusController.java b/spring-integration-http/src/main/java/org/springframework/integration/http/management/ControlBusController.java index 722a78366a0..00d7c20ec43 100644 --- a/spring-integration-http/src/main/java/org/springframework/integration/http/management/ControlBusController.java +++ b/spring-integration-http/src/main/java/org/springframework/integration/http/management/ControlBusController.java @@ -43,7 +43,6 @@ * The REST Controller to provide the management API for Control Bus pattern. * * @author Artem Bilan - * @author Glenn Renfro * * @since 6.4 */ From d8e268fe684b7718847939189d15ac961c123094 Mon Sep 17 00:00:00 2001 From: Glenn Renfro Date: Wed, 10 Sep 2025 18:35:36 -0400 Subject: [PATCH 4/4] Update RouterSpec to suppress nullability This is for performance reasons --- .../java/org/springframework/integration/dsl/RouterSpec.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/dsl/RouterSpec.java b/spring-integration-core/src/main/java/org/springframework/integration/dsl/RouterSpec.java index 8d4d74f3e20..d0353ede6ff 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/dsl/RouterSpec.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/dsl/RouterSpec.java @@ -255,6 +255,7 @@ void addMapping(Object key, NamedComponent channel) { } @Override + @SuppressWarnings("NullAway") // Performance protected void onInit() { super.onInit(); ConversionService conversionService = getConversionService(); @@ -274,7 +275,6 @@ else if (conversionService.canConvert(key.getClass(), String.class)) { throw new MessagingException("Unsupported channel mapping type for router [" + key.getClass() + "]"); } - Assert.notNull(channelKey, "'channelKey' must not be null"); this.router.setChannelMapping(channelKey, entry.getValue().getComponentName()); } }