From 40aa5672d7eace02f16aa5f946c59baceaaf72e6 Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Tue, 13 Mar 2018 15:55:06 -0400 Subject: [PATCH] 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** --- .../handler/support/CollectionArgumentResolver.java | 8 +++----- .../handler/support/MessagingMethodInvokerHelper.java | 4 +--- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/handler/support/CollectionArgumentResolver.java b/spring-integration-core/src/main/java/org/springframework/integration/handler/support/CollectionArgumentResolver.java index cf8ab5d8f0..53b2c9f5a6 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/handler/support/CollectionArgumentResolver.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/handler/support/CollectionArgumentResolver.java @@ -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> messages = (Collection>) 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())) { diff --git a/spring-integration-core/src/main/java/org/springframework/integration/handler/support/MessagingMethodInvokerHelper.java b/spring-integration-core/src/main/java/org/springframework/integration/handler/support/MessagingMethodInvokerHelper.java index c634a6c349..68dc3288da 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/handler/support/MessagingMethodInvokerHelper.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/handler/support/MessagingMethodInvokerHelper.java @@ -1242,9 +1242,7 @@ public class MessagingMethodInvokerHelper 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();