diff --git a/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/config/package-info.java b/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/config/package-info.java index 81af3146f7a..7aaeacd51a0 100644 --- a/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/config/package-info.java +++ b/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/config/package-info.java @@ -1,4 +1,5 @@ /** * Provides classes for configuration - parsers, namespace handlers. */ +@org.jspecify.annotations.NullMarked package org.springframework.integration.webflux.config; diff --git a/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/dsl/WebFlux.java b/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/dsl/WebFlux.java index 4fec971648b..a55fc16feca 100644 --- a/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/dsl/WebFlux.java +++ b/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/dsl/WebFlux.java @@ -19,10 +19,11 @@ import java.net.URI; import java.util.function.Function; +import org.jspecify.annotations.Nullable; + import org.springframework.expression.Expression; import org.springframework.integration.expression.FunctionExpression; import org.springframework.integration.webflux.inbound.WebFluxInboundEndpoint; -import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.web.reactive.function.client.WebClient; diff --git a/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/dsl/WebFluxMessageHandlerSpec.java b/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/dsl/WebFluxMessageHandlerSpec.java index f5d78ec4375..99766144ebe 100644 --- a/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/dsl/WebFluxMessageHandlerSpec.java +++ b/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/dsl/WebFluxMessageHandlerSpec.java @@ -19,6 +19,8 @@ import java.net.URI; import java.util.function.Function; +import org.jspecify.annotations.Nullable; + import org.springframework.core.ParameterizedTypeReference; import org.springframework.expression.Expression; import org.springframework.expression.common.LiteralExpression; @@ -27,7 +29,6 @@ import org.springframework.integration.expression.ValueExpression; import org.springframework.integration.http.dsl.BaseHttpMessageHandlerSpec; import org.springframework.integration.webflux.outbound.WebFluxRequestExecutingMessageHandler; -import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.web.reactive.function.BodyExtractor; import org.springframework.web.reactive.function.client.WebClient; @@ -47,8 +48,7 @@ public class WebFluxMessageHandlerSpec extends BaseHttpMessageHandlerSpec { - @Nullable - protected final WebClient webClient; // NOSONAR - final + protected final @Nullable WebClient webClient; protected WebFluxMessageHandlerSpec(URI uri, @Nullable WebClient webClient) { this(new ValueExpression<>(uri), webClient); diff --git a/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/dsl/package-info.java b/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/dsl/package-info.java index 961f399976e..aa14b092595 100644 --- a/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/dsl/package-info.java +++ b/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/dsl/package-info.java @@ -1,6 +1,5 @@ /** * Provides WebFlux Components support for Spring Integration Java DSL. */ -@org.springframework.lang.NonNullApi -@org.springframework.lang.NonNullFields +@org.jspecify.annotations.NullMarked package org.springframework.integration.webflux.dsl; diff --git a/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/inbound/WebFluxInboundEndpoint.java b/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/inbound/WebFluxInboundEndpoint.java index 68b4a552ddc..16c8ed1c383 100644 --- a/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/inbound/WebFluxInboundEndpoint.java +++ b/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/inbound/WebFluxInboundEndpoint.java @@ -27,6 +27,7 @@ import java.util.function.Supplier; import java.util.stream.Collectors; +import org.jspecify.annotations.Nullable; import org.reactivestreams.Publisher; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -458,7 +459,7 @@ private List getProducibleMediaTypes(ResolvableType elementType) { .collect(Collectors.toList()); } - private MediaType selectMediaType(ServerWebExchange exchange, Supplier> producibleTypesSupplier) { + private @Nullable MediaType selectMediaType(ServerWebExchange exchange, Supplier> producibleTypesSupplier) { List acceptableTypes = getAcceptableTypes(exchange); List producibleTypes = getProducibleTypes(exchange, producibleTypesSupplier); diff --git a/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/inbound/WebFluxIntegrationRequestMappingHandlerMapping.java b/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/inbound/WebFluxIntegrationRequestMappingHandlerMapping.java index 02524525575..53fcc6388a6 100644 --- a/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/inbound/WebFluxIntegrationRequestMappingHandlerMapping.java +++ b/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/inbound/WebFluxIntegrationRequestMappingHandlerMapping.java @@ -21,6 +21,8 @@ import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; +import org.jspecify.annotations.Nullable; + import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor; import org.springframework.context.ApplicationListener; @@ -86,6 +88,7 @@ public class WebFluxIntegrationRequestMappingHandlerMapping extends RequestMappingHandlerMapping implements ApplicationListener, DestructionAwareBeanPostProcessor { + @SuppressWarnings("NullAway") // Reflection private static final Method HANDLER_METHOD = ReflectionUtils.findMethod(WebHandler.class, "handle", ServerWebExchange.class); @@ -103,7 +106,10 @@ public Object postProcessBeforeInitialization(Object bean, String beanName) thro @Override public void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException { if (isHandler(bean.getClass())) { - unregisterMapping(getMappingForEndpoint((WebFluxInboundEndpoint) bean)); + RequestMappingInfo mapping = getMappingForEndpoint((WebFluxInboundEndpoint) bean); + if (mapping != null) { + unregisterMapping(mapping); + } } } @@ -118,13 +124,14 @@ protected boolean isHandler(Class beanType) { } @Override + @SuppressWarnings("NullAway") // Dataflow analysis limitation protected void detectHandlerMethods(Object handler) { if (handler instanceof String string) { - handler = getApplicationContext().getBean(string); // NOSONAR never null + handler = getApplicationContext().getBean(string); } RequestMappingInfo mapping = getMappingForEndpoint((WebFluxInboundEndpoint) handler); if (mapping != null) { - registerMapping(mapping, handler, HANDLER_METHOD); // NOSONAR never null + registerMapping(mapping, handler, HANDLER_METHOD); } } @@ -134,7 +141,7 @@ protected void detectHandlerMethods(Object handler) { * {@link org.springframework.integration.http.inbound.RequestMapping}. * @see RequestMappingHandlerMapping#getMappingForMethod */ - private RequestMappingInfo getMappingForEndpoint(WebFluxInboundEndpoint endpoint) { + private @Nullable RequestMappingInfo getMappingForEndpoint(WebFluxInboundEndpoint endpoint) { org.springframework.web.bind.annotation.RequestMapping requestMappingAnnotation = HttpContextUtils.convertRequestMappingToAnnotation(endpoint.getRequestMapping()); if (requestMappingAnnotation != null) { @@ -146,7 +153,7 @@ private RequestMappingInfo getMappingForEndpoint(WebFluxInboundEndpoint endpoint } @Override - protected CorsConfiguration initCorsConfiguration(Object handler, Method method, RequestMappingInfo mappingInfo) { + protected @Nullable CorsConfiguration initCorsConfiguration(Object handler, Method method, RequestMappingInfo mappingInfo) { CrossOrigin crossOrigin = ((BaseHttpInboundEndpoint) handler).getCrossOrigin(); if (crossOrigin != null) { return buildCorsConfiguration(crossOrigin, mappingInfo); diff --git a/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/inbound/package-info.java b/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/inbound/package-info.java index 5dd7f19ba75..bf26044da29 100644 --- a/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/inbound/package-info.java +++ b/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/inbound/package-info.java @@ -1,4 +1,5 @@ /** * Provides classes supporting inbound endpoints. */ +@org.jspecify.annotations.NullMarked package org.springframework.integration.webflux.inbound; diff --git a/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/support/package-info.java b/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/support/package-info.java index e9427f0978d..ff6afa3b241 100644 --- a/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/support/package-info.java +++ b/spring-integration-webflux/src/main/java/org/springframework/integration/webflux/support/package-info.java @@ -1,4 +1,5 @@ /** * Provides classes to support WebFlux endpoints. */ +@org.jspecify.annotations.NullMarked package org.springframework.integration.webflux.support;