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**
This commit is contained in:
committed by
Gary Russell
parent
7f20dd1b2a
commit
40aa5672d7
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2017 the original author or authors.
|
||||
* Copyright 2017-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -65,7 +65,7 @@ public class CollectionArgumentResolver extends AbstractExpressionEvaluator
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public Object resolveArgument(MethodParameter parameter, Message<?> message) throws Exception {
|
||||
public Object resolveArgument(MethodParameter parameter, Message<?> message) {
|
||||
Object value = message.getPayload();
|
||||
|
||||
if (this.canProcessMessageList) {
|
||||
@@ -75,8 +75,7 @@ public class CollectionArgumentResolver extends AbstractExpressionEvaluator
|
||||
|
||||
Collection<Message<?>> messages = (Collection<Message<?>>) value;
|
||||
|
||||
parameter.increaseNestingLevel();
|
||||
if (Message.class.isAssignableFrom(parameter.getNestedParameterType())) {
|
||||
if (Message.class.isAssignableFrom(parameter.nested().getNestedParameterType())) {
|
||||
value = messages;
|
||||
}
|
||||
else {
|
||||
@@ -84,7 +83,6 @@ public class CollectionArgumentResolver extends AbstractExpressionEvaluator
|
||||
.map(Message::getPayload)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
parameter.decreaseNestingLevel();
|
||||
}
|
||||
|
||||
if (Iterator.class.isAssignableFrom(parameter.getParameterType())) {
|
||||
|
||||
@@ -1242,9 +1242,7 @@ public class MessagingMethodInvokerHelper<T> extends AbstractExpressionEvaluator
|
||||
}
|
||||
this.targetParameterTypeDescriptor = targetParameterType;
|
||||
if (Message.class.isAssignableFrom(targetParameterType.getObjectType())) {
|
||||
methodParameter.increaseNestingLevel();
|
||||
this.targetParameterType = methodParameter.getNestedParameterType();
|
||||
methodParameter.decreaseNestingLevel();
|
||||
this.targetParameterType = methodParameter.nested().getNestedParameterType();
|
||||
}
|
||||
else {
|
||||
this.targetParameterType = targetParameterType.getObjectType();
|
||||
|
||||
Reference in New Issue
Block a user