Skip to content

Commit 6d2380d

Browse files
committed
GH-10082: Add io.spring.nullability Gradle plugin
Fixes: #10082 * Experiment with `NullAway` in some HTTP module packages
1 parent b8116d5 commit 6d2380d

File tree

4 files changed

+25
-12
lines changed

4 files changed

+25
-12
lines changed

build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ plugins {
2525
id 'com.github.spotbugs' version '6.1.13'
2626
id 'com.google.protobuf' version '0.9.5' apply false
2727
id 'io.freefair.aggregate-javadoc' version '8.13.1'
28+
id 'io.spring.nullability' version '0.0.1' apply false
2829
}
2930

3031
if (isCI) {
@@ -202,6 +203,7 @@ configure(javaProjects) { subproject ->
202203
apply plugin: 'checkstyle'
203204
apply plugin: 'kotlin'
204205
apply plugin: 'kotlin-spring'
206+
apply plugin: 'io.spring.nullability'
205207

206208
apply from: "${rootDir}/gradle/publish-maven.gradle"
207209

spring-integration-http/src/main/java/org/springframework/integration/http/outbound/AbstractHttpRequestExecutingMessageHandler.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.ArrayList;
2323
import java.util.Arrays;
2424
import java.util.Collection;
25+
import java.util.Collections;
2526
import java.util.HashMap;
2627
import java.util.List;
2728
import java.util.Map;
@@ -91,8 +92,10 @@ public abstract class AbstractHttpRequestExecutingMessageHandler extends Abstrac
9192

9293
private final Expression uriExpression;
9394

95+
@SuppressWarnings("NullAway.Init")
9496
private StandardEvaluationContext evaluationContext;
9597

98+
@SuppressWarnings("NullAway.Init")
9699
private SimpleEvaluationContext simpleEvaluationContext;
97100

98101
private boolean trustedSpel;
@@ -314,7 +317,7 @@ protected Object handleRequestMessage(Message<?> requestMessage) {
314317
() -> "'uriExpression' evaluation must result in a 'String' or 'URI' instance, not: "
315318
+ (uri == null ? "null" : uri.getClass()));
316319

317-
Map<String, ?> uriVariables = null;
320+
Map<String, ?> uriVariables = Collections.emptyMap();
318321

319322
if (uri instanceof String) {
320323
uriVariables = determineUriVariables(requestMessage);
@@ -325,7 +328,7 @@ protected Object handleRequestMessage(Message<?> requestMessage) {
325328

326329
@Nullable
327330
protected abstract Object exchange(Object uri, HttpMethod httpMethod, HttpEntity<?> httpRequest,
328-
@Nullable Object expectedResponseType, Message<?> requestMessage, @Nullable Map<String, ?> uriVariables);
331+
Object expectedResponseType, Message<?> requestMessage, Map<String, ?> uriVariables);
329332

330333
protected Object getReply(ResponseEntity<?> httpResponse) {
331334
HttpHeaders httpHeaders = httpResponse.getHeaders();
@@ -518,12 +521,10 @@ private HttpMethod determineHttpMethod(Message<?> requestMessage) {
518521
}
519522
}
520523

521-
@Nullable
522524
private Object determineExpectedResponseType(Message<?> requestMessage) {
523525
return evaluateTypeFromExpression(requestMessage, this.expectedResponseTypeExpression, "expectedResponseType");
524526
}
525527

526-
@Nullable
527528
protected Object evaluateTypeFromExpression(Message<?> requestMessage, @Nullable Expression expression,
528529
String property) {
529530

@@ -548,6 +549,9 @@ protected Object evaluateTypeFromExpression(Message<?> requestMessage, @Nullable
548549
}
549550
}
550551
}
552+
else {
553+
type = Void.class;
554+
}
551555
return type;
552556
}
553557

spring-integration-http/src/main/java/org/springframework/integration/http/outbound/HttpRequestExecutingMessageHandler.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,19 @@ public HttpRequestExecutingMessageHandler(String uri, @Nullable RestTemplate res
116116
*/
117117
public HttpRequestExecutingMessageHandler(Expression uriExpression, @Nullable RestTemplate restTemplate) {
118118
super(uriExpression);
119-
this.restTemplateExplicitlySet = restTemplate != null;
120-
this.restTemplate = (this.restTemplateExplicitlySet ? restTemplate : new RestTemplate());
121-
if (!this.restTemplateExplicitlySet) {
122-
this.restTemplate.setUriTemplateHandler(this.uriFactory);
119+
RestTemplate restTemplateToSet;
120+
121+
if (restTemplate != null) {
122+
restTemplateToSet = restTemplate;
123+
this.restTemplateExplicitlySet = true;
124+
}
125+
else {
126+
restTemplateToSet = new RestTemplate();
127+
restTemplateToSet.setUriTemplateHandler(this.uriFactory);
128+
this.restTemplateExplicitlySet = false;
123129
}
130+
131+
this.restTemplate = restTemplateToSet;
124132
}
125133

126134
@Override
@@ -174,7 +182,7 @@ public void setEncodingMode(DefaultUriBuilderFactory.EncodingMode encodingMode)
174182
@Override
175183
@Nullable
176184
protected Object exchange(Object uri, HttpMethod httpMethod, HttpEntity<?> httpRequest,
177-
@Nullable Object expectedResponseType, Message<?> requestMessage, @Nullable Map<String, ?> uriVariables) {
185+
Object expectedResponseType, Message<?> requestMessage, Map<String, ?> uriVariables) {
178186

179187
ResponseEntity<?> httpResponse;
180188
try {

spring-integration-http/src/test/java/org/springframework/integration/http/HttpProxyScenarioTests.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@
5454
import org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter;
5555

5656
import static org.assertj.core.api.Assertions.assertThat;
57-
import static org.mockito.ArgumentMatchers.isNull;
5857

5958
/**
6059
* @author Artem Bilan
@@ -134,7 +133,7 @@ public void testHttpProxyScenario() throws Exception {
134133
return new ResponseEntity<>(responseHeaders, HttpStatus.OK);
135134
}).when(template)
136135
.exchange(Mockito.anyString(), Mockito.any(HttpMethod.class),
137-
Mockito.any(HttpEntity.class), (Class<?>) isNull(), Mockito.anyMap());
136+
Mockito.any(HttpEntity.class), Mockito.<Class<?>>any(), Mockito.anyMap());
138137

139138
PropertyAccessor dfa = new DirectFieldAccessor(this.handler);
140139
dfa.setPropertyValue("restTemplate", template);
@@ -195,7 +194,7 @@ public void testHttpMultipartProxyScenario() throws Exception {
195194
return new ResponseEntity<>(responseHeaders, HttpStatus.OK);
196195
}).when(template)
197196
.exchange(Mockito.anyString(), Mockito.any(HttpMethod.class),
198-
Mockito.any(HttpEntity.class), (Class<?>) isNull(), Mockito.anyMap());
197+
Mockito.any(HttpEntity.class), Mockito.<Class<?>>any(), Mockito.anyMap());
199198

200199
PropertyAccessor dfa = new DirectFieldAccessor(this.handlermp);
201200
dfa.setPropertyValue("restTemplate", template);

0 commit comments

Comments
 (0)