【问题标题】:Vaadin 21/Fusion - ts enum module which is generated from Java enum has all camel case values changed to uppercaseVaadin 21/Fusion - 从 Java 枚举生成的 ts 枚举模块将所有驼峰式大小写值更改为大写
【发布时间】:2021-11-04 15:39:03
【问题描述】:

我在尝试将组合框绑定到我的模型时遇到了这个问题。 枚举值在后端提交到我的端点类时为空。

<vaadin-combo-box label="identifier type" id="identifier_type"
    ${field(this.binder.model.entity.identification.idType)}
    .items="${Object.values(KeyType)}">
</vaadin-combo-box>

Java 枚举如下所示:

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

但是生成的 ts 枚举是这样的:

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

所有值都变为大写,这就是为什么 binder 无法匹配具有驼峰写法的值,从而导致字段为空值。

这可以配置吗,这是设计使然,还是一个错误?

谢谢&BR 丹尼尔

【问题讨论】:

  • 对于代码生成,Fusion 使用枚举值的实际名称 (FRAGMENTID),而不是传递给构造函数的字符串值 ("FragmentId")。在您传递给构造函数的所有参数可以是任何类型(例如布尔值)之后,它可能不是唯一的,并且可能有多个。除此之外,您的代码看起来不错,而且我无法重现您的值未正确映射的问题。
  • 我现在通过在 KeyType 类的 @JsonCreator fromValue 方法中放置一个 equalsIgnoreCase 而不是 equals 来“修复它”。

标签: java enums vaadin vaadin21 hilla


【解决方案1】:

它不像值被更改为大写。 Fusion 生成器只使用枚举元素名称作为键和值,忽略括号中的任何数据。这是设计使然,目前没有计划改变这种行为。

这里的原因是 TypeScript 枚举不如 Java 强大。例如,您将字符串作为枚举元素值发送;但如果它是一个对象呢? TS 枚举无法反映这种变化,因此 Fusion 生成器也无法做到这一点。

虽然没有改变内置行为的计划,但未来 Fusion 生成器将更加灵活,因此您可以对其进行调整以支持您的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 2023-01-18
    • 2015-10-27
    • 1970-01-01
    相关资源
    最近更新 更多