From 4c6d5fd7526ae486e6482824b579c7276bd91869 Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Fri, 23 Jul 2010 02:58:47 +0000 Subject: [PATCH] INT-670 now supporting a method-level @Payload containing a SpEL expression for Gateway methods --- .../handler/ArgumentArrayMessageMapper.java | 49 +++++++++++++++---- .../GatewayProxyMessageMappingTests.java | 14 +++++- 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/handler/ArgumentArrayMessageMapper.java b/spring-integration-core/src/main/java/org/springframework/integration/handler/ArgumentArrayMessageMapper.java index e1cdd2afe6..c2a998f078 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/handler/ArgumentArrayMessageMapper.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/handler/ArgumentArrayMessageMapper.java @@ -26,6 +26,9 @@ import java.util.Map; import org.springframework.core.LocalVariableTableParameterNameDiscoverer; import org.springframework.core.MethodParameter; import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.expression.Expression; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; import org.springframework.integration.annotation.Header; import org.springframework.integration.annotation.Headers; import org.springframework.integration.annotation.Payload; @@ -96,12 +99,18 @@ import org.springframework.util.StringUtils; */ public class ArgumentArrayMessageMapper implements InboundMessageMapper { - private Map staticHeaders; + private static final SpelExpressionParser PARSER = new SpelExpressionParser(); + + + private final Map staticHeaders; private final Method method; private final List parameterList; + private final Expression payloadExpression; + + public ArgumentArrayMessageMapper(Method method) { this(method, null); } @@ -110,9 +119,11 @@ public class ArgumentArrayMessageMapper implements InboundMessageMapper toMessage(Object[] arguments) { Assert.notNull(arguments, "cannot map null arguments to Message"); if (arguments.length != this.parameterList.size()) { @@ -128,19 +139,24 @@ public class ArgumentArrayMessageMapper implements InboundMessageMapper headers = new HashMap(); + if (this.payloadExpression != null) { + StandardEvaluationContext context = new StandardEvaluationContext(); + context.setVariable("args", arguments); + messageOrPayload = this.payloadExpression.getValue(context); + } for (int i = 0; i < this.parameterList.size(); i++) { Object argumentValue = arguments[i]; MethodParameter methodParameter = this.parameterList.get(i); Annotation annotation = this.findMappingAnnotation(methodParameter.getParameterAnnotations()); if (annotation != null) { if (annotation.annotationType().equals(Payload.class)) { + if (messageOrPayload != null) { + this.throwExceptionForMultipleMessageOrPayloadParameters(methodParameter); + } if (((Payload) annotation).value().length() != 0) { throw new MessagingException( "The Payload annotation does not support an expression when mapping to a Message."); } - if (messageOrPayload != null) { - this.throwExceptionForMultipleMessageOrPayloadParameters(methodParameter); - } foundPayloadAnnotation = true; messageOrPayload = argumentValue; } @@ -176,7 +192,7 @@ public class ArgumentArrayMessageMapper implements InboundMessageMapper getMethodParameterList(Method method) { + private static List getMethodParameterList(Method method) { List parameterList = new LinkedList(); ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer(); int parameterCount = method.getParameterTypes().length; @@ -246,4 +262,17 @@ public class ArgumentArrayMessageMapper implements InboundMessageMapper result = channel.receive(0); + assertNotNull(result); + assertEquals("foobar!", result.getPayload()); + } + + @Test(expected = MessagingException.class) public void twoMapsWithoutAnnotations() { Map map1 = new HashMap(); @@ -160,6 +169,9 @@ public class GatewayProxyMessageMappingTests { void twoMapsAndOneAnnotatedWithPayload(@Payload Map payload, Map headers); + @Payload("#args[0] + #args[1] + '!'") + void payloadAnnotationAtMethodLevel(String a, String b); + // invalid void twoMapsWithoutAnnotations(Map m1, Map m2);