From a5694cdc42f6be0154d12f1dcabf471df6e0895a Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Thu, 29 May 2014 12:07:49 -0400 Subject: [PATCH] INT-3423 Fix Expression-Based Splitter JIRA: https://jira.spring.io/browse/INT-3423 Consider a message containing "one one" and a splitter with expression "payload.split(' ')", only one message is emitted. The default Collection created by SpEL is a HashSet. Change the ExpressionEvaluatingSplitter to expect a List instead of a Collection. --- .../splitter/ExpressionEvaluatingSplitter.java | 9 +++++---- .../SpelSplitterIntegrationTests-context.xml | 2 ++ .../splitter/SpelSplitterIntegrationTests.java | 17 ++++++++++++++++- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/splitter/ExpressionEvaluatingSplitter.java b/spring-integration-core/src/main/java/org/springframework/integration/splitter/ExpressionEvaluatingSplitter.java index 52baa2be8d..06007dfc9d 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/splitter/ExpressionEvaluatingSplitter.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/splitter/ExpressionEvaluatingSplitter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2002-2014 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. @@ -16,7 +16,7 @@ package org.springframework.integration.splitter; -import java.util.Collection; +import java.util.List; import org.springframework.expression.Expression; import org.springframework.integration.handler.ExpressionEvaluatingMessageProcessor; @@ -26,15 +26,16 @@ import org.springframework.integration.handler.ExpressionEvaluatingMessageProces * expression. The result of evaluation will typically be a Collection or * Array. If the result is not a Collection or Array, then the single Object * will be returned as the payload of a single reply Message. - * + * * @author Mark Fisher + * @author Gary Russell * @since 2.0 */ public class ExpressionEvaluatingSplitter extends AbstractMessageProcessingSplitter { @SuppressWarnings({"unchecked", "rawtypes"}) public ExpressionEvaluatingSplitter(Expression expression) { - super(new ExpressionEvaluatingMessageProcessor(expression, Collection.class)); + super(new ExpressionEvaluatingMessageProcessor(expression, List.class)); } } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/splitter/SpelSplitterIntegrationTests-context.xml b/spring-integration-core/src/test/java/org/springframework/integration/splitter/SpelSplitterIntegrationTests-context.xml index 2579e40260..7ad5a57a6a 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/splitter/SpelSplitterIntegrationTests-context.xml +++ b/spring-integration-core/src/test/java/org/springframework/integration/splitter/SpelSplitterIntegrationTests-context.xml @@ -13,6 +13,8 @@ + + diff --git a/spring-integration-core/src/test/java/org/springframework/integration/splitter/SpelSplitterIntegrationTests.java b/spring-integration-core/src/test/java/org/springframework/integration/splitter/SpelSplitterIntegrationTests.java index 28a31bf24d..32d901fc24 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/splitter/SpelSplitterIntegrationTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/splitter/SpelSplitterIntegrationTests.java @@ -17,6 +17,7 @@ package org.springframework.integration.splitter; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import java.util.ArrayList; @@ -26,10 +27,10 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.integration.support.MessageBuilder; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.PollableChannel; -import org.springframework.integration.support.MessageBuilder; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -43,12 +44,26 @@ public class SpelSplitterIntegrationTests { @Autowired private MessageChannel simpleInput; + @Autowired + private MessageChannel dups; + @Autowired private MessageChannel beanResolvingInput; @Autowired private PollableChannel output; + @Test + public void dups() { + Message message = MessageBuilder.withPayload("one one").build(); + this.dups.send(message); + Message one = output.receive(0); + Message two = output.receive(0); + assertNotNull(one); + assertNotNull(two); + assertEquals("one", one.getPayload()); + assertEquals("one", two.getPayload()); + } @Test public void simple() {