diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/message/MethodParameterMessageMapper.java b/org.springframework.integration/src/main/java/org/springframework/integration/message/MethodParameterMessageMapper.java index 6942a37df8..d431bbd4e8 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/message/MethodParameterMessageMapper.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/message/MethodParameterMessageMapper.java @@ -100,39 +100,52 @@ public class MethodParameterMessageMapper implements InboundMessageMapper payloadCandidates = new HashSet(); - int messagesFound = 0; - for (MethodParameterMetadata metadata : parameterMetadata) { - if (metadata.getHeaderAnnotation() == null && !metadata.hasHeadersAnnotation() - && !Message.class.isAssignableFrom(metadata.getParameterType())) { - payloadCandidates.add(metadata); + int messageTypedParameterCount = 0; + for (MethodParameterMetadata metadata : mpm) { + if (Message.class.isAssignableFrom(metadata.getParameterType())) { + // expecting Message, not a payload candidate + messageTypedParameterCount++; } - else if (Message.class.isAssignableFrom(metadata.getParameterType())) { - messagesFound++; + else if (metadata.getHeaderAnnotation() == null && !metadata.hasHeadersAnnotation()) { + // not expecting Message, and not explicitly annotated for headers + payloadCandidates.add(metadata); } } if (payloadCandidates.size() > 1) { Iterator iterator = payloadCandidates.iterator(); while (iterator.hasNext()) { Class type = iterator.next().getParameterType(); - if (Map.class.isAssignableFrom(type) || Properties.class.isAssignableFrom(type)) { + if (Map.class.isAssignableFrom(type)) { + // Map (or Properties) may accept headers rather than payload iterator.remove(); } } } - Assert.isTrue(payloadCandidates.size() + messagesFound <= 1, - "Could not find at most one message or payload parameter among [" + parameterMetadata - + "] ended up with the candidates [" + payloadCandidates + "]"); - MethodParameterMetadata methodParameterMetadata = payloadCandidates.toArray(new MethodParameterMetadata[1])[0]; - return methodParameterMetadata; + if (payloadCandidates.size() + messageTypedParameterCount > 1) { + // too many candidates, create a helpful error message + int count = 0; + String[] candidateTypes = new String[payloadCandidates.size()]; + for (MethodParameterMetadata candidate : payloadCandidates) { + candidateTypes[count++] = candidate.getParameterType().getName(); + } + throw new IllegalArgumentException("At most one message or payload parameter " + + "is allowed on handler method [" + this.method.getName() + + "], but the following payload candidate types were found [" + + StringUtils.arrayToCommaDelimitedString(candidateTypes) + + "] and " + messageTypedParameterCount + " Message type(s)."); + } + return (payloadCandidates.isEmpty() ? null : payloadCandidates.iterator().next()); } private MethodParameterMetadata[] initializeParameterMetadata() {