diff --git a/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/support/DefaultAmqpHeaderMapper.java b/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/support/DefaultAmqpHeaderMapper.java index d3ed544bcf0..0630cf38526 100644 --- a/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/support/DefaultAmqpHeaderMapper.java +++ b/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/support/DefaultAmqpHeaderMapper.java @@ -56,6 +56,7 @@ * @author Artem Bilan * @author Stephane Nicoll * @author Steve Singer + * @author Glenn Renfro * * @since 2.1 */ @@ -107,8 +108,8 @@ protected DefaultAmqpHeaderMapper(String @Nullable [] requestHeaderNames, String * Extract "standard" headers from an AMQP MessageProperties instance. */ @Override - protected Map extractStandardHeaders(MessageProperties amqpMessageProperties) { - Map headers = new HashMap<>(); + protected Map extractStandardHeaders(MessageProperties amqpMessageProperties) { + Map headers = new HashMap<>(); try { JavaUtils.INSTANCE .acceptIfNotNull(AmqpHeaders.APP_ID, amqpMessageProperties.getAppId(), headers::put) @@ -326,13 +327,13 @@ else if (contentType instanceof String) { } @Override - public Map toHeadersFromRequest(MessageProperties source) { - Map headersFromRequest = super.toHeadersFromRequest(source); + public Map toHeadersFromRequest(MessageProperties source) { + Map headersFromRequest = super.toHeadersFromRequest(source); addConsumerMetadata(source, headersFromRequest); return headersFromRequest; } - private void addConsumerMetadata(MessageProperties messageProperties, Map headers) { + private void addConsumerMetadata(MessageProperties messageProperties, Map headers) { String consumerTag = messageProperties.getConsumerTag(); if (consumerTag != null) { headers.put(AmqpHeaders.CONSUMER_TAG, consumerTag); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/mapping/AbstractHeaderMapper.java b/spring-integration-core/src/main/java/org/springframework/integration/mapping/AbstractHeaderMapper.java index 07ce55ac230..46ba0048faf 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/mapping/AbstractHeaderMapper.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/mapping/AbstractHeaderMapper.java @@ -51,6 +51,7 @@ * @author Stephane Nicoll * @author Gary Russell * @author Artem Bilan + * @author Glenn Renfro * * @since 2.1 */ @@ -87,7 +88,7 @@ public abstract class AbstractHeaderMapper implements RequestReplyHeaderMappe private HeaderMatcher replyHeaderMatcher; - private ClassLoader classLoader = ClassUtils.getDefaultClassLoader(); + private @Nullable ClassLoader classLoader = ClassUtils.getDefaultClassLoader(); /** * Create a new instance. @@ -113,7 +114,7 @@ public void setBeanClassLoader(ClassLoader classLoader) { this.classLoader = classLoader; } - protected ClassLoader getClassLoader() { + protected @Nullable ClassLoader getClassLoader() { return this.classLoader; } @@ -204,12 +205,12 @@ public void fromHeadersToReply(MessageHeaders headers, T target) { } @Override - public Map toHeadersFromRequest(T source) { + public Map toHeadersFromRequest(T source) { return toHeaders(source, this.requestHeaderMatcher); } @Override - public Map toHeadersFromReply(T source) { + public Map toHeadersFromReply(T source) { return toHeaders(source, this.replyHeaderMatcher); } @@ -264,18 +265,19 @@ private boolean isMessageChannel(String headerName, Object headerValue) { * Map headers from a source instance to the {@link MessageHeaders} of * a {@link org.springframework.messaging.Message}. */ - private Map toHeaders(T source, HeaderMatcher headerMatcher) { - Map headers = new HashMap<>(); - Map standardHeaders = extractStandardHeaders(source); + private Map toHeaders(T source, HeaderMatcher headerMatcher) { + Map headers = new HashMap<>(); + Map standardHeaders = extractStandardHeaders(source); copyHeaders(standardHeaders, headers, headerMatcher); - Map userDefinedHeaders = extractUserDefinedHeaders(source); + Map userDefinedHeaders = extractUserDefinedHeaders(source); copyHeaders(userDefinedHeaders, headers, headerMatcher); return headers; } - private void copyHeaders(Map source, Map target, HeaderMatcher headerMatcher) { + private void copyHeaders(Map source, Map target, + HeaderMatcher headerMatcher) { if (!CollectionUtils.isEmpty(source)) { - for (Map.Entry entry : source.entrySet()) { + for (Map.Entry entry : source.entrySet()) { try { String headerName = createTargetPropertyName(entry.getKey(), false); if (shouldMapHeader(headerName, headerMatcher)) { @@ -322,8 +324,7 @@ private boolean shouldMapHeader(String headerName, HeaderMatcher headerMatcher) } @SuppressWarnings("unchecked") - @Nullable - protected V getHeaderIfAvailable(Map headers, String name, Class type) { + protected @Nullable V getHeaderIfAvailable(Map headers, String name, Class type) { Object value = headers.get(name); if (value == null) { return null; @@ -365,7 +366,7 @@ protected Collection getTransientHeaderNames() { * @param source the source object to extract standard headers. * @return the map of headers to be mapped. */ - protected abstract Map extractStandardHeaders(T source); + protected abstract Map extractStandardHeaders(T source); /** * Extract the user-defined headers from the specified source. diff --git a/spring-integration-core/src/main/java/org/springframework/integration/mapping/package-info.java b/spring-integration-core/src/main/java/org/springframework/integration/mapping/package-info.java index 337992af6e3..bf272339294 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/mapping/package-info.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/mapping/package-info.java @@ -1,5 +1,5 @@ /** * Provides classes related to mapping to/from message headers. */ -@org.springframework.lang.NonNullApi +@org.jspecify.annotations.NullMarked package org.springframework.integration.mapping; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/mapping/support/JsonHeaders.java b/spring-integration-core/src/main/java/org/springframework/integration/mapping/support/JsonHeaders.java index 97fe27528e5..7536cacb0b0 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/mapping/support/JsonHeaders.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/mapping/support/JsonHeaders.java @@ -24,6 +24,7 @@ import org.springframework.core.ResolvableType; import org.springframework.core.convert.TypeDescriptor; +import org.springframework.lang.Contract; import org.springframework.util.ClassUtils; /** @@ -32,6 +33,7 @@ * * @author Artem Bilan * @author Gary Russell + * @author Glenn Renfro * * @since 3.0 */ @@ -67,18 +69,17 @@ private JsonHeaders() { * @return the {@link ResolvableType} based on provided class components * @since 5.2.4 */ - public static ResolvableType buildResolvableType(ClassLoader classLoader, Object targetClassValue, + public static ResolvableType buildResolvableType(@Nullable ClassLoader classLoader, Object targetClassValue, @Nullable Object contentClassValue, @Nullable Object keyClassValue) { Class targetClass = getClassForValue(classLoader, targetClassValue); Class keyClass = getClassForValue(classLoader, keyClassValue); Class contentClass = getClassForValue(classLoader, contentClassValue); - return buildResolvableType(targetClass, contentClass, keyClass); } - @Nullable - private static Class getClassForValue(ClassLoader classLoader, @Nullable Object classValue) { + @Contract("_, null -> null; _, !null -> !null") + private static @Nullable Class getClassForValue(@Nullable ClassLoader classLoader, @Nullable Object classValue) { if (classValue instanceof Class) { return (Class) classValue; } @@ -105,7 +106,6 @@ else if (classValue != null) { */ public static ResolvableType buildResolvableType(Class targetClass, @Nullable Class contentClass, @Nullable Class keyClass) { - if (keyClass != null) { return TypeDescriptor .map(targetClass, diff --git a/spring-integration-core/src/main/java/org/springframework/integration/mapping/support/package-info.java b/spring-integration-core/src/main/java/org/springframework/integration/mapping/support/package-info.java index 0fa87a63755..f9be565ab30 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/mapping/support/package-info.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/mapping/support/package-info.java @@ -1,4 +1,5 @@ /** * Support classes for mapping. */ +@org.jspecify.annotations.NullMarked package org.springframework.integration.mapping.support; diff --git a/spring-integration-ws/src/main/java/org/springframework/integration/ws/DefaultSoapHeaderMapper.java b/spring-integration-ws/src/main/java/org/springframework/integration/ws/DefaultSoapHeaderMapper.java index 35980ae9068..d36e6b1b373 100644 --- a/spring-integration-ws/src/main/java/org/springframework/integration/ws/DefaultSoapHeaderMapper.java +++ b/spring-integration-ws/src/main/java/org/springframework/integration/ws/DefaultSoapHeaderMapper.java @@ -56,6 +56,7 @@ * @author Artem Bilan * @author Gary Russell * @author Jooyoung Pyoung + * @author Glenn Renfro * * @since 2.0 */ @@ -74,10 +75,10 @@ public DefaultSoapHeaderMapper() { } @Override - protected Map extractStandardHeaders(SoapMessage source) { + protected Map extractStandardHeaders(SoapMessage source) { final String soapAction = source.getSoapAction(); if (StringUtils.hasText(soapAction)) { - Map headers = new HashMap<>(1); + Map headers = new HashMap<>(1); headers.put(WebServiceHeaders.SOAP_ACTION, soapAction); return headers; } diff --git a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/support/DefaultXmppHeaderMapper.java b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/support/DefaultXmppHeaderMapper.java index 7168f3025a0..2a877407166 100644 --- a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/support/DefaultXmppHeaderMapper.java +++ b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/support/DefaultXmppHeaderMapper.java @@ -41,6 +41,7 @@ * @author Florian Schmaus * @author Stephane Nicoll * @author Artem Bilan + * @author Glenn Renfro * * @since 2.1 */ @@ -61,8 +62,8 @@ public DefaultXmppHeaderMapper() { } @Override - protected Map extractStandardHeaders(MessageBuilder source) { - Map headers = new HashMap<>(); + protected Map extractStandardHeaders(MessageBuilder source) { + Map headers = new HashMap<>(); Jid from = source.getFrom(); if (from != null) { headers.put(XmppHeaders.FROM, from.toString());