You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vaadin应用中如何将Java POJO传递至JavaScript?

解决方案

方案1:直接利用Vaadin的自动序列化机制传递POJO列表

Vaadin的executeJs方法原生支持将Java对象(包括列表)自动序列化为JavaScript对象,无需手动转换JSON。只需确保你的POJO符合Jackson序列化规则:

  1. 你的EmployeePojo已经满足序列化要求:

    • firstName、lastName为public字段
    • 私有字段startDate有对应的getStart() getter方法
  2. 直接传递列表即可:

var list = new ArrayList<EmployeePojo>();
initList(list);
UI.getCurrent().getPage().executeJs("addData($0, $1, $2)", getElement(), name, list);
  1. 前端addData函数中,第三个参数会是JS对象数组,每个对象包含firstName、lastName、start字段(对应getStart()方法)。如果需要调整字段名,可给getter添加@JsonProperty注解:
import com.fasterxml.jackson.annotation.JsonProperty;

// ...

@JsonProperty("startDate")
public LocalDate getStart() {
    return this.startDate;
}

方案2:手动用Jackson序列化(规避elemental.json类加载冲突)

如果自动序列化不符合需求,直接用Jackson将列表转为JSON字符串,前端解析即可:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

// 初始化ObjectMapper(建议全局单例)
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule()); // 处理LocalDate等Java8时间类型

// 序列化为JSON字符串
String employeeJson = mapper.writeValueAsString(list);

// 传递给前端并解析
UI.getCurrent().getPage().executeJs("addData($0, $1, JSON.parse($2))", getElement(), name, employeeJson);

方案3:修复elemental.json的类加载冲突

你遇到的LinkageError是因为elemental.json.JsonObject被多个Quarkus类加载器重复加载导致的,可通过调整依赖排除重复包:

在Maven的pom.xml中,排除Vaadin或Quarkus侧重复的elemental-json依赖,确保类路径中只有一个版本:

<!-- 排除Vaadin自带的elemental-json -->
<dependency>
    <groupId>com.vaadin</groupId>
    <artifactId>vaadin-core</artifactId>
    <version>24.0.11</version>
    <exclusions>
        <exclusion>
            <groupId>elemental.json</groupId>
            <artifactId>elemental-json</artifactId>
        </exclusion>
    </exclusions>
</dependency>

内容的提问来源于stack exchange,提问作者Mindaugas Jaraminas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 06:17:25