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

Vaadin21/Fusion生成TS枚举全转大写导致后端绑定值为空如何处理

这是Vaadin Fusion的默认设计,并非Bug,可通过配置对齐前后端枚举规则解决。

问题原因说明

Fusion 生成前端 TypeScript 枚举时,默认读取 Java 枚举常量的name()返回值(也就是你代码中定义的全大写常量名),不会自动读取枚举自定义构造参数中的赋值。而 Fusion 底层依赖 Jackson 完成前后端数据的序列化、反序列化,默认场景下 Jackson 也以枚举的name()作为匹配基准,你遇到的空值问题,本质是前后端枚举序列化规则不匹配导致的。


解决方法

方法1:统一序列化规则(最推荐)

在Java枚举的自定义值字段或对应getter上添加Jackson的@JsonValue注解,让序列化、反序列化、TS生成都以这个自定义值为准:

public enum KeyType {
  CUSTOM("Custom"),
  IRDI("IRDI"),
  IRI("IRI"),
  IDSHORT("IdShort"),
  FRAGMENTID("FragmentId");

  @JsonValue // 新增该注解即可
  private final String value;

  KeyType(String value) {
    this.value = value;
  }
}

加完注解后重新编译项目,Fusion自动生成的TS枚举会自动适配为你需要的格式:

enum KeyType {
  CUSTOM = 'Custom',
  IRDI = 'IRDI',
  IRI = 'IRI',
  IDSHORT = 'IdShort',
  FRAGMENTID = 'FragmentId',
}

前后端序列化规则完全对齐后,空值问题就会解决。

方法2:调整前端绑定逻辑(无需修改后端代码)

如果不想改动后端序列化规则,可以调整vaadin-combo-box的绑定配置,让提交的值和Java枚举的name()(全大写)对齐,同时前端显示你需要的驼峰文本:

<vaadin-combo-box label="identifier type" id="identifier_type"
    ${field(this.binder.model.entity.identification.idType)}
    .items="${[
      {label: 'Custom', value: KeyType.CUSTOM},
      {label: 'IRDI', value: KeyType.IRDI},
      {label: 'IRI', value: KeyType.IRI},
      {label: 'IdShort', value: KeyType.IDSHORT},
      {label: 'FragmentId', value: KeyType.FRAGMENTID}
    ]}"
    item-label-path="label"
    item-value-path="value">
</vaadin-combo-box>

这种方式提交的value和后端默认反序列化规则对齐,也可以解决空值问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:36:03