From ecb5ace5f30b83808a13fdfd9932f5dce563b7cf Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Fri, 5 Dec 2025 19:28:43 +0200 Subject: [PATCH] fix: allow non-Serializable beans in Element.callJsFunction Element.callJsFunction was incorrectly using Serializable[] for parameter storage and System.arraycopy to copy Object[] arguments. This caused ArrayStoreException when passing non-Serializable objects like plain beans or records. Changed to use Object[] instead, matching the implementation pattern used in Element.executeJs and Page.executeJs, which correctly support all Jackson-serializable types including non-Serializable beans. Added test to verify beans can be passed to callJsFunction. --- .../src/main/java/com/vaadin/flow/dom/Element.java | 6 +++--- .../java/com/vaadin/flow/dom/ElementJacksonTest.java | 12 ++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/flow-server/src/main/java/com/vaadin/flow/dom/Element.java b/flow-server/src/main/java/com/vaadin/flow/dom/Element.java index 1cafe613a54..e1eb83ecdb9 100644 --- a/flow-server/src/main/java/com/vaadin/flow/dom/Element.java +++ b/flow-server/src/main/java/com/vaadin/flow/dom/Element.java @@ -1634,11 +1634,11 @@ public PendingJavaScriptResult callJsFunction(String functionName, String paramPlaceholderString = IntStream.range(1, arguments.length + 1) .mapToObj(i -> "$" + i).collect(Collectors.joining(",")); // Inject the element as $0 - Serializable[] jsParameters; + Object[] jsParameters; if (arguments.length == 0) { - jsParameters = new Serializable[] { this }; + jsParameters = new Object[] { this }; } else { - jsParameters = new Serializable[arguments.length + 1]; + jsParameters = new Object[arguments.length + 1]; jsParameters[0] = this; System.arraycopy(arguments, 0, jsParameters, 1, arguments.length); } diff --git a/flow-server/src/test/java/com/vaadin/flow/dom/ElementJacksonTest.java b/flow-server/src/test/java/com/vaadin/flow/dom/ElementJacksonTest.java index f099e29e0fb..341b712f8ac 100644 --- a/flow-server/src/test/java/com/vaadin/flow/dom/ElementJacksonTest.java +++ b/flow-server/src/test/java/com/vaadin/flow/dom/ElementJacksonTest.java @@ -2342,6 +2342,18 @@ public void callFunctionTwoParams() { assertPendingJs(ui, "return $0.method($1,$2)", element, "foo", 123); } + @Test + public void callFunctionWithBean() { + UI ui = new MockUI(); + Element element = ElementFactory.createDiv(); + SimpleBean bean = new SimpleBean(); + element.callJsFunction("method", bean); + ui.getElement().appendChild(element); + ui.getInternals().getStateTree().runExecutionsBeforeClientResponse(); + + assertPendingJs(ui, "return $0.method($1)", element, bean); + } + @Test public void callFunctionOnProperty() { UI ui = new MockUI();