From 9e5f674509251111a121dea78a2e21743c7123aa Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Wed, 12 Jun 2019 17:48:27 -0400 Subject: [PATCH 1/2] Fix SplitterMH for primitive arrays cast The plain cast like `(Object[]) array` doesn't work for array of primitives - fails with `ClassCastException` * Use `ObjectUtils.toObjectArray()` instead which does a smart job to determine a wrapper for primitive and cast into that array of types afterwards --- .../splitter/AbstractMessageSplitter.java | 5 +++-- .../integration/splitter/DefaultSplitterTests.java | 12 ++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/splitter/AbstractMessageSplitter.java b/spring-integration-core/src/main/java/org/springframework/integration/splitter/AbstractMessageSplitter.java index ec35e755794..c93130b6a3f 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/splitter/AbstractMessageSplitter.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/splitter/AbstractMessageSplitter.java @@ -34,6 +34,7 @@ import org.springframework.integration.support.json.JacksonPresent; import org.springframework.integration.util.FunctionIterator; import org.springframework.messaging.Message; +import org.springframework.util.ObjectUtils; import com.fasterxml.jackson.core.TreeNode; import reactor.core.publisher.Flux; @@ -62,7 +63,7 @@ public void setApplySequence(boolean applySequence) { @Override @SuppressWarnings("unchecked") protected final Object handleRequestMessage(Message message) { - Object result = this.splitMessage(message); + Object result = splitMessage(message); // return null if 'null' if (result == null) { return null; @@ -87,7 +88,7 @@ protected final Object handleRequestMessage(Message message) { } } else if (result.getClass().isArray()) { - Object[] items = (Object[]) result; + Object[] items = ObjectUtils.toObjectArray(result);; sequenceSize = items.length; if (reactive) { flux = Flux.fromArray(items); diff --git a/spring-integration-core/src/test/java/org/springframework/integration/splitter/DefaultSplitterTests.java b/spring-integration-core/src/test/java/org/springframework/integration/splitter/DefaultSplitterTests.java index 787cc649ddb..74ceeaa00a4 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/splitter/DefaultSplitterTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/splitter/DefaultSplitterTests.java @@ -54,7 +54,7 @@ public class DefaultSplitterTests { @Test - public void splitMessageWithArrayPayload() throws Exception { + public void splitMessageWithArrayPayload() { String[] payload = new String[] { "x", "y", "z" }; Message message = MessageBuilder.withPayload(payload).build(); QueueChannel replyChannel = new QueueChannel(); @@ -75,7 +75,7 @@ public void splitMessageWithArrayPayload() throws Exception { } @Test - public void splitMessageWithCollectionPayload() throws Exception { + public void splitMessageWithCollectionPayload() { List payload = Arrays.asList("x", "y", "z"); Message> message = MessageBuilder.withPayload(payload).build(); QueueChannel replyChannel = new QueueChannel(); @@ -163,20 +163,20 @@ public void splitFlux() { @Test public void splitArrayPayloadReactive() { - Message message = new GenericMessage<>(new String[] { "x", "y", "z" }); + Message message = new GenericMessage<>(new int[] { 0, 1, 2 }); FluxMessageChannel replyChannel = new FluxMessageChannel(); DefaultMessageSplitter splitter = new DefaultMessageSplitter(); splitter.setOutputChannel(replyChannel); splitter.handleMessage(message); - Flux testFlux = + Flux testFlux = Flux.from(replyChannel) .map(Message::getPayload) - .cast(String.class); + .cast(Integer.class); StepVerifier.create(testFlux) - .expectNext("x", "y", "z") + .expectNext(0, 1, 2) .then(() -> ((Subscriber) TestUtils.getPropertyValue(replyChannel, "subscribers", List.class).get(0)) .onComplete()) From 810a3c53d527c6922c376f8bf538ee009f0559c3 Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Wed, 12 Jun 2019 21:47:26 -0400 Subject: [PATCH 2/2] * Fix Checkstyle violation --- .../integration/splitter/AbstractMessageSplitter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/splitter/AbstractMessageSplitter.java b/spring-integration-core/src/main/java/org/springframework/integration/splitter/AbstractMessageSplitter.java index c93130b6a3f..0185b516cd4 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/splitter/AbstractMessageSplitter.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/splitter/AbstractMessageSplitter.java @@ -88,7 +88,7 @@ protected final Object handleRequestMessage(Message message) { } } else if (result.getClass().isArray()) { - Object[] items = ObjectUtils.toObjectArray(result);; + Object[] items = ObjectUtils.toObjectArray(result); sequenceSize = items.length; if (reactive) { flux = Flux.fromArray(items);