diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/AbstractAggregatingMessageGroupProcessor.java b/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/AbstractAggregatingMessageGroupProcessor.java index 7c7ac2a59f..c9ed34cfd1 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/AbstractAggregatingMessageGroupProcessor.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/AbstractAggregatingMessageGroupProcessor.java @@ -40,13 +40,17 @@ public abstract class AbstractAggregatingMessageGroupProcessor implements Messag private final Log logger = LogFactory.getLog(this.getClass()); + @SuppressWarnings("unchecked") public final void processAndSend(MessageGroup group, MessageChannelTemplate channelTemplate, MessageChannel outputChannel) { Assert.notNull(group, "MessageGroup must not be null"); Assert.notNull(outputChannel, "'outputChannel' must not be null"); Object payload = this.aggregatePayloads(group); Map headers = this.aggregateHeaders(group); - Message message = MessageBuilder.withPayload(payload).copyHeadersIfAbsent(headers).build(); + MessageBuilder builder = (payload instanceof Message) + ? MessageBuilder.fromMessage((Message) payload) + : MessageBuilder.withPayload(payload); + Message message = builder.copyHeadersIfAbsent(headers).build(); channelTemplate.send(message, outputChannel); } diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/aggregator/integration/MethodInvokingAggregatorReturningMessageTests-context.xml b/org.springframework.integration/src/test/java/org/springframework/integration/aggregator/integration/MethodInvokingAggregatorReturningMessageTests-context.xml new file mode 100644 index 0000000000..9c0452da3d --- /dev/null +++ b/org.springframework.integration/src/test/java/org/springframework/integration/aggregator/integration/MethodInvokingAggregatorReturningMessageTests-context.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/aggregator/integration/MethodInvokingAggregatorReturningMessageTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/aggregator/integration/MethodInvokingAggregatorReturningMessageTests.java new file mode 100644 index 0000000000..d29d41c34a --- /dev/null +++ b/org.springframework.integration/src/test/java/org/springframework/integration/aggregator/integration/MethodInvokingAggregatorReturningMessageTests.java @@ -0,0 +1,81 @@ +/* + * Copyright 2002-2010 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.integration.aggregator.integration; + +import static org.junit.Assert.assertFalse; + +import java.util.Collections; +import java.util.List; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.integration.channel.DirectChannel; +import org.springframework.integration.channel.PollableChannel; +import org.springframework.integration.core.Message; +import org.springframework.integration.message.MessageBuilder; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * @author Mark Fisher + */ +@ContextConfiguration +@RunWith(SpringJUnit4ClassRunner.class) +public class MethodInvokingAggregatorReturningMessageTests { + + @Autowired + DirectChannel pojoInput; + + @Autowired + DirectChannel defaultInput; + + @Autowired + PollableChannel pojoOutput; + + @Autowired + PollableChannel defaultOutput; + + + @Test // INT-1107 + public void messageReturningPojoAggregatorResultIsNotWrappedInAnotherMessage() { + List payload = Collections.singletonList("test"); + pojoInput.send(MessageBuilder.withPayload(payload).build()); + Message result = pojoOutput.receive(); + assertFalse(Message.class.isAssignableFrom(result.getPayload().getClass())); + } + + @Test + public void defaultAggregatorResultIsNotWrappedInAnotherMessage() { + List payload = Collections.singletonList("test"); + defaultInput.send(MessageBuilder.withPayload(payload).build()); + Message result = defaultOutput.receive(); + assertFalse(Message.class.isAssignableFrom(result.getPayload().getClass())); + } + + + @SuppressWarnings("unused") + private static class TestAggregator { + + public Message aggregate(final List> messages) { + List payload = Collections.singletonList("foo"); + return MessageBuilder.withPayload(payload).setHeader("bar", 123).build(); + } + } + +}