Skip to content

Commit 5ad4f62

Browse files
artembilangaryrussell
authored andcommitted
Fix SplitterMH for primitive arrays cast (#2964)
* 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 * * Fix Checkstyle violation
1 parent 2afe115 commit 5ad4f62

File tree

2 files changed

+9
-8
lines changed

2 files changed

+9
-8
lines changed

spring-integration-core/src/main/java/org/springframework/integration/splitter/AbstractMessageSplitter.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springframework.integration.support.json.JacksonPresent;
3535
import org.springframework.integration.util.FunctionIterator;
3636
import org.springframework.messaging.Message;
37+
import org.springframework.util.ObjectUtils;
3738

3839
import com.fasterxml.jackson.core.TreeNode;
3940
import reactor.core.publisher.Flux;
@@ -62,7 +63,7 @@ public void setApplySequence(boolean applySequence) {
6263
@Override
6364
@SuppressWarnings("unchecked")
6465
protected final Object handleRequestMessage(Message<?> message) {
65-
Object result = this.splitMessage(message);
66+
Object result = splitMessage(message);
6667
// return null if 'null'
6768
if (result == null) {
6869
return null;
@@ -87,7 +88,7 @@ protected final Object handleRequestMessage(Message<?> message) {
8788
}
8889
}
8990
else if (result.getClass().isArray()) {
90-
Object[] items = (Object[]) result;
91+
Object[] items = ObjectUtils.toObjectArray(result);
9192
sequenceSize = items.length;
9293
if (reactive) {
9394
flux = Flux.fromArray(items);

spring-integration-core/src/test/java/org/springframework/integration/splitter/DefaultSplitterTests.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
public class DefaultSplitterTests {
5555

5656
@Test
57-
public void splitMessageWithArrayPayload() throws Exception {
57+
public void splitMessageWithArrayPayload() {
5858
String[] payload = new String[] { "x", "y", "z" };
5959
Message<String[]> message = MessageBuilder.withPayload(payload).build();
6060
QueueChannel replyChannel = new QueueChannel();
@@ -75,7 +75,7 @@ public void splitMessageWithArrayPayload() throws Exception {
7575
}
7676

7777
@Test
78-
public void splitMessageWithCollectionPayload() throws Exception {
78+
public void splitMessageWithCollectionPayload() {
7979
List<String> payload = Arrays.asList("x", "y", "z");
8080
Message<List<String>> message = MessageBuilder.withPayload(payload).build();
8181
QueueChannel replyChannel = new QueueChannel();
@@ -163,20 +163,20 @@ public void splitFlux() {
163163

164164
@Test
165165
public void splitArrayPayloadReactive() {
166-
Message<?> message = new GenericMessage<>(new String[] { "x", "y", "z" });
166+
Message<?> message = new GenericMessage<>(new int[] { 0, 1, 2 });
167167
FluxMessageChannel replyChannel = new FluxMessageChannel();
168168
DefaultMessageSplitter splitter = new DefaultMessageSplitter();
169169
splitter.setOutputChannel(replyChannel);
170170

171171
splitter.handleMessage(message);
172172

173-
Flux<String> testFlux =
173+
Flux<Integer> testFlux =
174174
Flux.from(replyChannel)
175175
.map(Message::getPayload)
176-
.cast(String.class);
176+
.cast(Integer.class);
177177

178178
StepVerifier.create(testFlux)
179-
.expectNext("x", "y", "z")
179+
.expectNext(0, 1, 2)
180180
.then(() ->
181181
((Subscriber<?>) TestUtils.getPropertyValue(replyChannel, "subscribers", List.class).get(0))
182182
.onComplete())

0 commit comments

Comments
 (0)