Skip to content

Commit fa47b0f

Browse files
artembilangaryrussell
authored andcommitted
INT-4428: MethodParam usage: fix race condition
JIRA: https://jira.spring.io/browse/INT-4428 Using `increaseNestingLevel()` and `decreaseNestingLevel()` is not thread-safe and may cause a race conditions * Use `MethodParameter.nested()` instead which creates and cache a new `MethodParameter` for the nested generic type **Cherry-pick to 5.0.x**
1 parent 194480d commit fa47b0f

File tree

2 files changed

+4
-8
lines changed

2 files changed

+4
-8
lines changed

spring-integration-core/src/main/java/org/springframework/integration/handler/support/CollectionArgumentResolver.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2017 the original author or authors.
2+
* Copyright 2017-2018 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -65,7 +65,7 @@ public boolean supportsParameter(MethodParameter parameter) {
6565

6666
@Override
6767
@SuppressWarnings("unchecked")
68-
public Object resolveArgument(MethodParameter parameter, Message<?> message) throws Exception {
68+
public Object resolveArgument(MethodParameter parameter, Message<?> message) {
6969
Object value = message.getPayload();
7070

7171
if (this.canProcessMessageList) {
@@ -75,16 +75,14 @@ public Object resolveArgument(MethodParameter parameter, Message<?> message) thr
7575

7676
Collection<Message<?>> messages = (Collection<Message<?>>) value;
7777

78-
parameter.increaseNestingLevel();
79-
if (Message.class.isAssignableFrom(parameter.getNestedParameterType())) {
78+
if (Message.class.isAssignableFrom(parameter.nested().getNestedParameterType())) {
8079
value = messages;
8180
}
8281
else {
8382
value = messages.stream()
8483
.map(Message::getPayload)
8584
.collect(Collectors.toList());
8685
}
87-
parameter.decreaseNestingLevel();
8886
}
8987

9088
if (Iterator.class.isAssignableFrom(parameter.getParameterType())) {

spring-integration-core/src/main/java/org/springframework/integration/util/MessagingMethodInvokerHelper.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1241,9 +1241,7 @@ private void setExclusiveTargetParameterType(TypeDescriptor targetParameterType,
12411241
}
12421242
this.targetParameterTypeDescriptor = targetParameterType;
12431243
if (Message.class.isAssignableFrom(targetParameterType.getObjectType())) {
1244-
methodParameter.increaseNestingLevel();
1245-
this.targetParameterType = methodParameter.getNestedParameterType();
1246-
methodParameter.decreaseNestingLevel();
1244+
this.targetParameterType = methodParameter.nested().getNestedParameterType();
12471245
}
12481246
else {
12491247
this.targetParameterType = targetParameterType.getObjectType();

0 commit comments

Comments
 (0)