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

如何让Vaadin Select使用ISO双字母代码作为选项值提交至Quarkus服务

解决方案

要让Vaadin Select提交ISO双字母语言代码而非索引值,有两种实用方案,可根据你的场景选择:

方案1:直接使用ISO代码作为选项类型(推荐)

这种方式最直接,无需操作底层DOM元素,提交的值天然就是后端需要的ISO代码:

// 定义语言映射:键为ISO双字母代码,值为显示给用户的语言名称
Map<String, String> languageMap = new HashMap<>();
languageMap.put("de", "Deutsch");
languageMap.put("en", "English");

Select<String> languageSelect = new Select<>();
languageSelect.setId("language");
languageSelect.getElement().setAttribute("name", "language");
// 设置选项为ISO代码集合
languageSelect.setItems(languageMap.keySet());
// 配置显示标签,让用户看到语言名称而非代码
languageSelect.setItemLabelGenerator(code -> languageMap.get(code));

表单提交时,language参数的值就是de或en,完全符合后端要求。

方案2:保留Locale类型,手动修改选项value属性

如果Vaadin业务逻辑需要直接使用Locale对象,可以保留原有Select<Locale>,但需手动给每个选项设置对应的ISO代码作为value:

Select<Locale> select = new Select<>();
select.setId("language");
select.getElement().setAttribute("name", "language");
select.setItems(Locale.GERMAN, Locale.ENGLISH);
// 可选:设置显示标签为语言名称
select.setItemLabelGenerator(locale -> locale.getDisplayLanguage(locale));

// 组件挂载到DOM后再修改选项value(避免元素未初始化)
select.addAttachListener(event -> {
    select.getItems().forEach(locale -> {
        // 找到对应Locale的选项元素
        Element itemElement = select.getElement().getChildren()
                .filter(child -> child.getProperty("value").equals(String.valueOf(select.getIndexOfItem(locale))))
                .findFirst()
                .orElseThrow(() -> new IllegalStateException("语言选项元素未找到"));
        // 设置value为ISO双字母代码
        itemElement.setAttribute("value", locale.getLanguage());
    });
});

注意事项

  • 方案2必须在组件attach之后处理,因为只有组件挂载到DOM时,Vaadin才会生成对应的<vaadin-item>元素。
  • 若后续动态添加/移除Locale选项,需要重新执行修改value的逻辑。

内容的提问来源于Stack Exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:50:02