diff --git a/spring-integration-cassandra/src/main/java/org/springframework/integration/cassandra/config/xml/CassandraParserUtils.java b/spring-integration-cassandra/src/main/java/org/springframework/integration/cassandra/config/xml/CassandraParserUtils.java index dcd315a893..11bc0f54e1 100644 --- a/spring-integration-cassandra/src/main/java/org/springframework/integration/cassandra/config/xml/CassandraParserUtils.java +++ b/spring-integration-cassandra/src/main/java/org/springframework/integration/cassandra/config/xml/CassandraParserUtils.java @@ -18,6 +18,7 @@ import java.util.List; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.springframework.beans.factory.config.BeanDefinition; @@ -91,7 +92,7 @@ public static void processOutboundTypeAttributes(Element element, ParserContext } - public static boolean areMutuallyExclusive(String query, BeanDefinition statementExpressionDef, + private static boolean areMutuallyExclusive(String query, @Nullable BeanDefinition statementExpressionDef, String ingestQuery) { return !StringUtils.hasText(query) && statementExpressionDef == null && !StringUtils.hasText(ingestQuery) diff --git a/spring-integration-cassandra/src/test/java/org/springframework/integration/cassandra/config/CassandraParserUtilsTests.java b/spring-integration-cassandra/src/test/java/org/springframework/integration/cassandra/config/CassandraParserUtilsTests.java deleted file mode 100644 index 6bee4a40b7..0000000000 --- a/spring-integration-cassandra/src/test/java/org/springframework/integration/cassandra/config/CassandraParserUtilsTests.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright 2022-present the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.integration.cassandra.config; - -import org.junit.jupiter.api.Test; - -import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.beans.factory.support.RootBeanDefinition; -import org.springframework.integration.cassandra.config.xml.CassandraParserUtils; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * @author Filippo Balicchia - * @author Artem Bilan - * - * @since 6.0 - */ -class CassandraParserUtilsTests { - - @Test - void mutuallyExclusiveCase1() { - String query = ""; - BeanDefinition statementExpressionDef = null; - String ingestQuery = ""; - assertThat(CassandraParserUtils.areMutuallyExclusive(query, statementExpressionDef, ingestQuery)).isTrue(); - } - - @Test - void mutuallyExclusiveCase2() { - String query = ""; - BeanDefinition statementExpressionDef = null; - String ingestQuery = - "insert into book (isbn, title, author, pages, saleDate, isInStock) values (?, ?, ?, ?, ?, ?)"; - assertThat(CassandraParserUtils.areMutuallyExclusive(query, statementExpressionDef, ingestQuery)).isTrue(); - } - - @Test - void mutuallyExclusiveCase3() { - String query = ""; - BeanDefinition statementExpressionDef = new RootBeanDefinition(); - String ingestQuery = ""; - assertThat(CassandraParserUtils.areMutuallyExclusive(query, statementExpressionDef, ingestQuery)).isTrue(); - } - - @Test - void mutuallyExclusiveCase4() { - String query = ""; - BeanDefinition statementExpressionDef = new RootBeanDefinition(); - String ingestQuery = - "insert into book (isbn, title, author, pages, saleDate, isInStock) values (?, ?, ?, ?, ?, ?)"; - assertThat(CassandraParserUtils.areMutuallyExclusive(query, statementExpressionDef, ingestQuery)).isFalse(); - } - - @Test - void mutuallyExclusiveCase5() { - String query = "SELECT * FROM book limit :size"; - BeanDefinition statementExpressionDef = new RootBeanDefinition(); - String ingestQuery = ""; - assertThat(CassandraParserUtils.areMutuallyExclusive(query, statementExpressionDef, ingestQuery)).isFalse(); - } - - @Test - void mutuallyExclusiveCase6() { - String query = "SELECT * FROM book limit :size"; - BeanDefinition statementExpressionDef = new RootBeanDefinition(); - String ingestQuery = - "insert into book (isbn, title, author, pages, saleDate, isInStock) values (?, ?, ?, ?, ?, ?)"; - assertThat(CassandraParserUtils.areMutuallyExclusive(query, statementExpressionDef, ingestQuery)).isFalse(); - } - - @Test - void mutuallyExclusiveCase7() { - String query = "SELECT * FROM book limit :size"; - BeanDefinition statementExpressionDef = new RootBeanDefinition(); - String ingestQuery = ""; - assertThat(CassandraParserUtils.areMutuallyExclusive(query, statementExpressionDef, ingestQuery)).isFalse(); - } - - @Test - void mutuallyExclusiveCase8() { - String query = "SELECT * FROM book limit :size"; - BeanDefinition statementExpressionDef = new RootBeanDefinition(); - String ingestQuery = - "insert into book (isbn, title, author, pages, saleDate, isInStock) values (?, ?, ?, ?, ?, ?)"; - assertThat(CassandraParserUtils.areMutuallyExclusive(query, statementExpressionDef, ingestQuery)).isFalse(); - } - -} diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/package-info.java b/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/package-info.java index 34352df4f2..9ec4b71e05 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/package-info.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/package-info.java @@ -1,4 +1,5 @@ /** * Provides classes supporting annotation-based configuration. */ +@org.jspecify.annotations.NullMarked package org.springframework.integration.config.annotation; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractChannelAdapterParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractChannelAdapterParser.java index 706d05ac0f..e3242f9af1 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractChannelAdapterParser.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractChannelAdapterParser.java @@ -16,6 +16,7 @@ package org.springframework.integration.config.xml; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.springframework.beans.MutablePropertyValues; @@ -61,6 +62,7 @@ else if (!StringUtils.hasText(id)) { return id; } + @SuppressWarnings("NullAway") @Override protected final AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { String channelName = element.getAttribute("channel"); @@ -88,7 +90,7 @@ protected final AbstractBeanDefinition parseInternal(Element element, ParserCont return beanDefinition; } - private String createDirectChannel(Element element, ParserContext parserContext) { + private @Nullable String createDirectChannel(Element element, ParserContext parserContext) { if (parserContext.isNested()) { return null; } diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractConsumerEndpointParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractConsumerEndpointParser.java index 84951138f8..964dbd4292 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractConsumerEndpointParser.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractConsumerEndpointParser.java @@ -19,6 +19,7 @@ import java.util.Collection; import java.util.List; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.springframework.beans.factory.BeanDefinitionStoreException; @@ -85,7 +86,7 @@ protected String getInputChannelAttributeName() { } @Override - protected final AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { + protected final @Nullable AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { BeanDefinitionBuilder handlerBuilder = parseHandler(element, parserContext); IntegrationNamespaceUtils.setValueIfAttributeDefined(handlerBuilder, element, "output-channel", "outputChannelName"); @@ -178,6 +179,7 @@ private void poller(Element element, ParserContext parserContext, BeanDefinition } } + @SuppressWarnings("NullAway") // Dataflow analysis limitation private void registerChannelForCreation(ParserContext parserContext, String inputChannelName, BeanDefinitionBuilder consumerEndpointBuilder) { @@ -194,13 +196,11 @@ private void registerChannelForCreation(ParserContext parserContext, String inpu if (vh == null) { //although it should never happen if it does we can fix it caValues.addIndexedArgumentValue(0, new ManagedSet()); } - @SuppressWarnings("unchecked") Collection channelCandidateNames = (Collection) caValues.getArgumentValue(0, Collection.class) - .getValue(); // NOSONAR see comment above - channelCandidateNames.add(inputChannelName); // NOSONAR - + .getValue(); + channelCandidateNames.add(inputChannelName); consumerEndpointBuilder.addDependsOn(IntegrationContextUtils.AUTO_CREATE_CHANNEL_CANDIDATES_BEAN_NAME); } else { diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractCorrelatingMessageHandlerParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractCorrelatingMessageHandlerParser.java index 999c58daec..13daeb27e9 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractCorrelatingMessageHandlerParser.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractCorrelatingMessageHandlerParser.java @@ -16,6 +16,7 @@ package org.springframework.integration.config.xml; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.springframework.beans.BeanMetadataElement; @@ -65,7 +66,7 @@ public abstract class AbstractCorrelatingMessageHandlerParser extends AbstractCo private static final String RELEASE_LOCK = "release-lock-before-send"; - protected void doParse(BeanDefinitionBuilder builder, Element element, BeanMetadataElement processor, + protected void doParse(BeanDefinitionBuilder builder, Element element, @Nullable BeanMetadataElement processor, ParserContext parserContext) { IntegrationNamespaceUtils.injectPropertyWithAdapter(CORRELATION_STRATEGY_REF_ATTRIBUTE, CORRELATION_STRATEGY_METHOD_ATTRIBUTE, diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractDelegatingConsumerEndpointParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractDelegatingConsumerEndpointParser.java index ab4c36557f..3f2f950b7c 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractDelegatingConsumerEndpointParser.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractDelegatingConsumerEndpointParser.java @@ -16,6 +16,7 @@ package org.springframework.integration.config.xml; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.springframework.beans.factory.config.BeanDefinition; @@ -65,7 +66,6 @@ else if (hasRef && hasExpression) { parserContext.getReaderContext().error( "Only one of 'ref' or 'expression' is permitted, not both, on element " + IntegrationNamespaceUtils.createElementDescription(element) + ".", source); - return null; } else if (hasRef) { builder.addPropertyReference("targetObject", ref); @@ -77,7 +77,6 @@ else if (!this.hasDefaultOption()) { parserContext.getReaderContext().error("Exactly one of the 'ref' attribute, 'expression' attribute, " + "or inner bean () definition is required for element " + IntegrationNamespaceUtils.createElementDescription(element) + ".", source); - return null; } methodAttribute(element, parserContext, source, builder, innerDefinition, hasRef, hasExpression, expressionElement); @@ -87,9 +86,9 @@ else if (!this.hasDefaultOption()) { return builder; } - private void innerDefinition(Element element, ParserContext parserContext, Object source, + private void innerDefinition(Element element, ParserContext parserContext, @Nullable Object source, BeanDefinitionBuilder builder, BeanComponentDefinition innerDefinition, boolean hasRef, - boolean hasExpression, Element expressionElement) { + boolean hasExpression, @Nullable Element expressionElement) { if (hasRef || hasExpression || expressionElement != null) { parserContext.getReaderContext().error( "Neither 'ref' nor 'expression' are permitted when an inner bean () is configured on element " + @@ -98,9 +97,9 @@ private void innerDefinition(Element element, ParserContext parserContext, Objec builder.addPropertyValue("targetObject", innerDefinition); } - private void scriptElement(Element element, ParserContext parserContext, Object source, + private void scriptElement(Element element, ParserContext parserContext, @Nullable Object source, BeanDefinitionBuilder builder, boolean hasRef, boolean hasExpression, Element scriptElement, - Element expressionElement) { + @Nullable Element expressionElement) { if (hasRef || hasExpression || expressionElement != null) { parserContext.getReaderContext().error( "Neither 'ref' nor 'expression' are permitted when an inner script element is configured on element " + @@ -110,7 +109,7 @@ private void scriptElement(Element element, ParserContext parserContext, Object builder.addPropertyValue("targetObject", scriptBeanDefinition); } - private void expressionElement(Element element, ParserContext parserContext, Object source, + private void expressionElement(Element element, ParserContext parserContext, @Nullable Object source, BeanDefinitionBuilder builder, boolean hasRef, boolean hasExpression, Element expressionElement) { if (hasRef || hasExpression) { parserContext.getReaderContext().error( @@ -126,9 +125,9 @@ private void expressionElement(Element element, ParserContext parserContext, Obj builder.addPropertyValue("expression", dynamicExpressionBuilder.getBeanDefinition()); } - private void methodAttribute(Element element, ParserContext parserContext, Object source, - BeanDefinitionBuilder builder, BeanComponentDefinition innerDefinition, boolean hasRef, - boolean hasExpression, Element expressionElement) { + private void methodAttribute(Element element, ParserContext parserContext, @Nullable Object source, + BeanDefinitionBuilder builder, @Nullable BeanComponentDefinition innerDefinition, boolean hasRef, + boolean hasExpression, @Nullable Element expressionElement) { String method = element.getAttribute(METHOD_ATTRIBUTE); if (StringUtils.hasText(method)) { if (hasExpression || expressionElement != null) { diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractIntegrationNamespaceHandler.java b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractIntegrationNamespaceHandler.java index e3f11a8b14..83b7f2c520 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractIntegrationNamespaceHandler.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractIntegrationNamespaceHandler.java @@ -18,6 +18,7 @@ import java.util.concurrent.atomic.AtomicBoolean; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.springframework.beans.factory.config.BeanDefinition; @@ -47,7 +48,7 @@ public abstract class AbstractIntegrationNamespaceHandler extends NamespaceHandl private final AtomicBoolean initialized = new AtomicBoolean(); @Override - public final BeanDefinition parse(Element element, ParserContext parserContext) { + public final @Nullable BeanDefinition parse(Element element, ParserContext parserContext) { if (!this.initialized.getAndSet(true)) { BeanDefinitionRegistry registry = parserContext.getRegistry(); new IntegrationRegistrar().registerBeanDefinitions(null, registry); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractOutboundChannelAdapterParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractOutboundChannelAdapterParser.java index 096a887c5d..c02d500626 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractOutboundChannelAdapterParser.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractOutboundChannelAdapterParser.java @@ -16,6 +16,7 @@ package org.springframework.integration.config.xml; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.springframework.beans.factory.config.BeanDefinition; @@ -82,7 +83,7 @@ protected AbstractBeanDefinition doParse(Element element, ParserContext parserCo } private void configureRequestHandlerAdviceChain(Element element, ParserContext parserContext, - BeanDefinition handlerBeanDefinition, BeanDefinitionBuilder consumerBuilder) { + BeanDefinition handlerBeanDefinition, @Nullable BeanDefinitionBuilder consumerBuilder) { Element txElement = DomUtils.getChildElementByTagName(element, "transactional"); Element adviceChainElement = DomUtils.getChildElementByTagName(element, IntegrationNamespaceUtils.REQUEST_HANDLER_ADVICE_CHAIN); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractPollingInboundChannelAdapterParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractPollingInboundChannelAdapterParser.java index 9e5346662d..3cacb9503a 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractPollingInboundChannelAdapterParser.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractPollingInboundChannelAdapterParser.java @@ -59,6 +59,8 @@ else if (source instanceof RuntimeBeanReference runtimeBeanReference) { } else { parserContext.getReaderContext().error("Wrong 'source' type: must be 'BeanDefinition' or 'RuntimeBeanReference'", source); + // This exception is meant to signal to NullAway that the error method throws an exception + throw new IllegalStateException("Wrong 'source' type: must be 'BeanDefinition' or 'RuntimeBeanReference'"); } adapterBuilder.addPropertyReference("source", sourceBeanName); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AnnotationConfigParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AnnotationConfigParser.java index acb88f5b67..3bd882b2b7 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AnnotationConfigParser.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AnnotationConfigParser.java @@ -20,6 +20,7 @@ import java.util.Map; import java.util.Set; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.springframework.beans.factory.config.BeanDefinition; @@ -46,7 +47,7 @@ public class AnnotationConfigParser implements BeanDefinitionParser { @Override - public BeanDefinition parse(Element element, ParserContext parserContext) { + public @Nullable BeanDefinition parse(Element element, ParserContext parserContext) { ExtendedAnnotationMetadata importingClassMetadata = new ExtendedAnnotationMetadata(element); BeanDefinitionRegistry registry = parserContext.getRegistry(); new IntegrationRegistrar() @@ -67,11 +68,11 @@ private static final class ExtendedAnnotationMetadata extends AnnotationMetadata } @Override - public Map getAnnotationAttributes(String annotationType) { + public @Nullable Map getAnnotationAttributes(String annotationType) { if (EnablePublisher.class.getName().equals(annotationType)) { Element enablePublisherElement = DomUtils.getChildElementByTagName(this.element, "enable-publisher"); if (enablePublisherElement != null) { - Map attributes = new HashMap<>(); + Map attributes = new HashMap<>(); attributes.put("defaultChannel", enablePublisherElement.getAttribute("default-publisher-channel")); attributes.put("proxyTargetClass", enablePublisherElement.getAttribute("proxy-target-class")); attributes.put("order", enablePublisherElement.getAttribute("order")); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/ChainParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/ChainParser.java index 2e1f4d4561..f2a783eaa1 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/ChainParser.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/ChainParser.java @@ -18,6 +18,7 @@ import java.util.HashSet; import java.util.List; +import java.util.Objects; import java.util.Set; import org.apache.commons.logging.Log; @@ -90,7 +91,6 @@ protected BeanDefinitionBuilder parseHandler(Element element, ParserContext pars parserContext.getReaderContext().error("A bean definition is already registered for " + "beanName: '" + handlerBeanName + "' within the current .", element); - return null; } } if ("gateway".equals(child.getLocalName())) { @@ -100,7 +100,7 @@ protected BeanDefinitionBuilder parseHandler(Element element, ParserContext pars handlerList.add(gwBuilder.getBeanDefinition()); } else { - handlerList.add(childBeanMetadata); + handlerList.add(Objects.requireNonNull(childBeanMetadata)); } } } @@ -142,14 +142,15 @@ private BeanMetadataElement parseChild(String chainHandlerId, Element element, i BeanDefinition beanDefinition = parserContext.getDelegate().parseCustomElement(element, parentDefinition); if (beanDefinition == null) { parserContext.getReaderContext().error("child BeanDefinition must not be null", element); - return null; + // This exception is meant to signal to NullAway that the error method throws an exception + throw new IllegalStateException("Child BeanDefinition must not be null"); } else { holder = new BeanDefinitionHolder(beanDefinition, handlerComponentName + IntegrationConfigUtils.HANDLER_ALIAS_SUFFIX); } } - holder.getBeanDefinition().getPropertyValues().add("componentName", handlerComponentName); // NOSONAR never null + Objects.requireNonNull(holder).getBeanDefinition().getPropertyValues().add("componentName", handlerComponentName); // NOSONAR never null if (hasId) { BeanDefinitionReaderUtils.registerBeanDefinition(holder, parserContext.getRegistry()); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/ChannelInterceptorParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/ChannelInterceptorParser.java index 41809508a0..bf2413b798 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/ChannelInterceptorParser.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/ChannelInterceptorParser.java @@ -18,6 +18,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.Objects; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -60,7 +61,7 @@ public ManagedList parseInterceptors(Element element, ParserContext parserContex if ("bean".equals(localName)) { BeanDefinitionParserDelegate delegate = parserContext.getDelegate(); BeanDefinitionHolder holder = delegate.parseBeanDefinitionElement(childElement); - holder = delegate.decorateBeanDefinitionIfRequired(childElement, holder); // NOSONAR never null + holder = delegate.decorateBeanDefinitionIfRequired(childElement, Objects.requireNonNull(holder)); parserContext.registerBeanComponent(new BeanComponentDefinition(holder)); interceptors.add(new RuntimeBeanReference(holder.getBeanName())); } @@ -73,6 +74,8 @@ else if ("ref".equals(localName)) { if (parser == null) { parserContext.getReaderContext().error( "unsupported interceptor element '" + localName + "'", childElement); + // Redundant Exception is here to satisfy NullAway warning parser.parse statement below. + throw new IllegalStateException("unsupported interceptor element '" + localName + "'"); } String interceptorBeanName = parser.parse(childElement, parserContext); interceptors.add(new RuntimeBeanReference(interceptorBeanName)); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/ConverterParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/ConverterParser.java index bd4ca8b491..71c76aa920 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/ConverterParser.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/ConverterParser.java @@ -16,6 +16,7 @@ package org.springframework.integration.config.xml; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.springframework.beans.BeanMetadataElement; @@ -41,7 +42,7 @@ public class ConverterParser extends AbstractBeanDefinitionParser { @Override - protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { + protected @Nullable AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { BeanDefinitionRegistry registry = parserContext.getRegistry(); BeanComponentDefinition converterDefinition = IntegrationNamespaceUtils.parseInnerHandlerDefinition(element, parserContext); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/DefaultInboundChannelAdapterParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/DefaultInboundChannelAdapterParser.java index 0b5fa05c64..a5cf7aeaba 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/DefaultInboundChannelAdapterParser.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/DefaultInboundChannelAdapterParser.java @@ -17,7 +17,9 @@ package org.springframework.integration.config.xml; import java.util.List; +import java.util.Objects; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Element; import org.springframework.beans.BeanMetadataElement; @@ -46,8 +48,8 @@ */ public class DefaultInboundChannelAdapterParser extends AbstractPollingInboundChannelAdapterParser { - @Override // NOSONAR complexity - protected BeanMetadataElement parseSource(Element element, ParserContext parserContext) { // NOSONAR + @Override + protected BeanMetadataElement parseSource(Element element, ParserContext parserContext) { Object source = parserContext.extractSource(element); BeanMetadataElement result = null; BeanComponentDefinition innerBeanDef = @@ -65,22 +67,26 @@ protected BeanMetadataElement parseSource(Element element, ParserContext parserC boolean hasExpressionElement = expressionElement != null; boolean hasMethod = StringUtils.hasText(methodName); - if (!hasInnerDef && !hasRef && !hasExpression && !hasScriptElement && !hasExpressionElement) { // NOSONAR + if (!hasInnerDef && !hasRef && !hasExpression && !hasScriptElement && !hasExpressionElement) { parserContext.getReaderContext().error( "Exactly one of the 'ref', 'expression', inner bean,