diff --git a/build.gradle b/build.gradle index 5ab55041da..58e8d27445 100644 --- a/build.gradle +++ b/build.gradle @@ -25,6 +25,7 @@ plugins { id 'com.github.spotbugs' version '6.1.13' id 'com.google.protobuf' version '0.9.5' apply false id 'io.freefair.aggregate-javadoc' version '8.13.1' + id 'io.spring.nullability' version '0.0.1' apply false } if (isCI) { @@ -202,6 +203,7 @@ configure(javaProjects) { subproject -> apply plugin: 'checkstyle' apply plugin: 'kotlin' apply plugin: 'kotlin-spring' + apply plugin: 'io.spring.nullability' apply from: "${rootDir}/gradle/publish-maven.gradle" diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/outbound/AbstractHttpRequestExecutingMessageHandler.java b/spring-integration-http/src/main/java/org/springframework/integration/http/outbound/AbstractHttpRequestExecutingMessageHandler.java index ce88e69e20..f0ab87f625 100644 --- a/spring-integration-http/src/main/java/org/springframework/integration/http/outbound/AbstractHttpRequestExecutingMessageHandler.java +++ b/spring-integration-http/src/main/java/org/springframework/integration/http/outbound/AbstractHttpRequestExecutingMessageHandler.java @@ -22,6 +22,7 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -91,8 +92,10 @@ public abstract class AbstractHttpRequestExecutingMessageHandler extends Abstrac private final Expression uriExpression; + @SuppressWarnings("NullAway.Init") private StandardEvaluationContext evaluationContext; + @SuppressWarnings("NullAway.Init") private SimpleEvaluationContext simpleEvaluationContext; private boolean trustedSpel; @@ -314,7 +317,7 @@ public abstract class AbstractHttpRequestExecutingMessageHandler extends Abstrac () -> "'uriExpression' evaluation must result in a 'String' or 'URI' instance, not: " + (uri == null ? "null" : uri.getClass())); - Map uriVariables = null; + Map uriVariables = Collections.emptyMap(); if (uri instanceof String) { uriVariables = determineUriVariables(requestMessage); @@ -325,7 +328,7 @@ public abstract class AbstractHttpRequestExecutingMessageHandler extends Abstrac @Nullable protected abstract Object exchange(Object uri, HttpMethod httpMethod, HttpEntity httpRequest, - @Nullable Object expectedResponseType, Message requestMessage, @Nullable Map uriVariables); + Object expectedResponseType, Message requestMessage, Map uriVariables); protected Object getReply(ResponseEntity httpResponse) { HttpHeaders httpHeaders = httpResponse.getHeaders(); @@ -518,12 +521,10 @@ public abstract class AbstractHttpRequestExecutingMessageHandler extends Abstrac } } - @Nullable private Object determineExpectedResponseType(Message requestMessage) { return evaluateTypeFromExpression(requestMessage, this.expectedResponseTypeExpression, "expectedResponseType"); } - @Nullable protected Object evaluateTypeFromExpression(Message requestMessage, @Nullable Expression expression, String property) { @@ -548,6 +549,9 @@ public abstract class AbstractHttpRequestExecutingMessageHandler extends Abstrac } } } + else { + type = Void.class; + } return type; } diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/outbound/HttpRequestExecutingMessageHandler.java b/spring-integration-http/src/main/java/org/springframework/integration/http/outbound/HttpRequestExecutingMessageHandler.java index 14c4176a9e..125e0ed78c 100755 --- a/spring-integration-http/src/main/java/org/springframework/integration/http/outbound/HttpRequestExecutingMessageHandler.java +++ b/spring-integration-http/src/main/java/org/springframework/integration/http/outbound/HttpRequestExecutingMessageHandler.java @@ -116,11 +116,19 @@ public class HttpRequestExecutingMessageHandler extends AbstractHttpRequestExecu */ public HttpRequestExecutingMessageHandler(Expression uriExpression, @Nullable RestTemplate restTemplate) { super(uriExpression); - this.restTemplateExplicitlySet = restTemplate != null; - this.restTemplate = (this.restTemplateExplicitlySet ? restTemplate : new RestTemplate()); - if (!this.restTemplateExplicitlySet) { - this.restTemplate.setUriTemplateHandler(this.uriFactory); + RestTemplate restTemplateToSet; + + if (restTemplate != null) { + restTemplateToSet = restTemplate; + this.restTemplateExplicitlySet = true; } + else { + restTemplateToSet = new RestTemplate(); + restTemplateToSet.setUriTemplateHandler(this.uriFactory); + this.restTemplateExplicitlySet = false; + } + + this.restTemplate = restTemplateToSet; } @Override @@ -174,7 +182,7 @@ public class HttpRequestExecutingMessageHandler extends AbstractHttpRequestExecu @Override @Nullable protected Object exchange(Object uri, HttpMethod httpMethod, HttpEntity httpRequest, - @Nullable Object expectedResponseType, Message requestMessage, @Nullable Map uriVariables) { + Object expectedResponseType, Message requestMessage, Map uriVariables) { ResponseEntity httpResponse; try { diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/HttpProxyScenarioTests.java b/spring-integration-http/src/test/java/org/springframework/integration/http/HttpProxyScenarioTests.java index 4ab5c77a21..9563b4388b 100644 --- a/spring-integration-http/src/test/java/org/springframework/integration/http/HttpProxyScenarioTests.java +++ b/spring-integration-http/src/test/java/org/springframework/integration/http/HttpProxyScenarioTests.java @@ -54,7 +54,6 @@ import org.springframework.web.servlet.HandlerMapping; import org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.isNull; /** * @author Artem Bilan @@ -134,7 +133,7 @@ public class HttpProxyScenarioTests { return new ResponseEntity<>(responseHeaders, HttpStatus.OK); }).when(template) .exchange(Mockito.anyString(), Mockito.any(HttpMethod.class), - Mockito.any(HttpEntity.class), (Class) isNull(), Mockito.anyMap()); + Mockito.any(HttpEntity.class), Mockito.>any(), Mockito.anyMap()); PropertyAccessor dfa = new DirectFieldAccessor(this.handler); dfa.setPropertyValue("restTemplate", template); @@ -195,7 +194,7 @@ public class HttpProxyScenarioTests { return new ResponseEntity<>(responseHeaders, HttpStatus.OK); }).when(template) .exchange(Mockito.anyString(), Mockito.any(HttpMethod.class), - Mockito.any(HttpEntity.class), (Class) isNull(), Mockito.anyMap()); + Mockito.any(HttpEntity.class), Mockito.>any(), Mockito.anyMap()); PropertyAccessor dfa = new DirectFieldAccessor(this.handlermp); dfa.setPropertyValue("restTemplate", template);