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
相关产品推荐
相关产品推荐

