diff --git a/spring-integration-core/src/main/java/org/springframework/integration/gateway/GatewayProxyFactoryBean.java b/spring-integration-core/src/main/java/org/springframework/integration/gateway/GatewayProxyFactoryBean.java index 6cefa64f2b..ab149f6b2b 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/gateway/GatewayProxyFactoryBean.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/gateway/GatewayProxyFactoryBean.java @@ -296,6 +296,7 @@ public class GatewayProxyFactoryBean extends AbstractEndpoint implements Factory } } ArgumentArrayMessageMapper messageMapper = new ArgumentArrayMessageMapper(method, staticHeaders); + messageMapper.setBeanFactory(this.getBeanFactory()); SimpleMessagingGateway gateway = new SimpleMessagingGateway(messageMapper, new SimpleMessageMapper()); gateway.setExceptionMapper(exceptionMapper); if (this.getTaskScheduler() != null) { 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 c2a998f078..5de7516d5f 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 @@ -23,9 +23,14 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.core.LocalVariableTableParameterNameDiscoverer; import org.springframework.core.MethodParameter; import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.expression.AccessException; +import org.springframework.expression.BeanResolver; +import org.springframework.expression.EvaluationContext; import org.springframework.expression.Expression; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; @@ -97,19 +102,21 @@ import org.springframework.util.StringUtils; * @author Oleg Zhurakousky * @since 2.0 */ -public class ArgumentArrayMessageMapper implements InboundMessageMapper { +public class ArgumentArrayMessageMapper implements InboundMessageMapper, BeanFactoryAware { private static final SpelExpressionParser PARSER = new SpelExpressionParser(); - private final Map staticHeaders; - private final Method method; + private final Map staticHeaders; + private final List parameterList; private final Expression payloadExpression; + private volatile BeanResolver beanResolver; + public ArgumentArrayMessageMapper(Method method) { this(method, null); @@ -124,7 +131,17 @@ public class ArgumentArrayMessageMapper implements InboundMessageMapper toMessage(Object[] arguments) { + public void setBeanFactory(final BeanFactory beanFactory) { + if (beanFactory != null) { + this.beanResolver = new BeanResolver() { + public Object resolve(EvaluationContext context, String beanName) throws AccessException { + return beanFactory.getBean(beanName); + } + }; + } + } + + public Message toMessage(Object[] arguments) { Assert.notNull(arguments, "cannot map null arguments to Message"); if (arguments.length != this.parameterList.size()) { String prefix = (arguments.length < this.parameterList.size()) ? "Not enough" : "Too many"; @@ -142,6 +159,9 @@ public class ArgumentArrayMessageMapper implements InboundMessageMapper result = channel.receive(0); + assertNotNull(result); + assertEquals("FOO!!!", result.getPayload()); + } @Test(expected = MessagingException.class) public void twoMapsWithoutAnnotations() { @@ -172,6 +189,9 @@ public class GatewayProxyMessageMappingTests { @Payload("#args[0] + #args[1] + '!'") void payloadAnnotationAtMethodLevel(String a, String b); + @Payload("@testBean.exclaim(#args[0])") + void payloadAnnotationAtMethodLevelUsingBeanResolver(String s); + // invalid void twoMapsWithoutAnnotations(Map m1, Map m2); @@ -189,4 +209,12 @@ public class GatewayProxyMessageMappingTests { } + + public static class TestBean { + + public String exclaim(String s) { + return s.toUpperCase() + "!!!"; + } + } + }