Vaadin 8 中Enum枚举值与文本框字符串绑定的实现问题咨询
问题原因
你遇到的报错是因为Vaadin Binder默认无法自动完成String类型的TextField值和ChangelogEventType枚举类型的双向转换,需要手动指定转换器实现类型映射。
解决方案
在绑定逻辑中添加withConverter方法,自定义双向转换规则,直接复用你已经在枚举类中实现的getText和fromString方法即可,修改后的绑定代码如下:
eventType = createTextField("Event", COLUMN_WIDTH); binder.forField(eventType) .withNullRepresentation("None") // 新增双向类型转换器 .withConverter( // 界面输入的字符串转后端枚举值 inputStr -> { if (inputStr == null || "None".equals(inputStr)) { return null; } return ChangelogEventType.fromString(inputStr); }, // 后端枚举值转界面展示的字符串 eventEnum -> eventEnum == null ? null : eventEnum.getText() ) .bind(ChangelogEvent::getEventType, ChangelogEvent::setEventType);
可选优化
如果该枚举需要在多个绑定场景中复用,可以把转换器抽为独立的公用类,还可以新增非法输入的错误提示:
import com.vaadin.data.Converter; import com.vaadin.data.Result; import com.vaadin.data.ValueContext; public class ChangelogEventTypeConverter implements Converter<String, ChangelogEventType> { @Override public Result<ChangelogEventType> convertToModel(String inputStr, ValueContext context) { if (inputStr == null || "None".equals(inputStr)) { return Result.ok(null); } ChangelogEventType eventType = ChangelogEventType.fromString(inputStr); return eventType == null ? Result.error("不合法的事件类型") : Result.ok(eventType); } @Override public String convertToPresentation(ChangelogEventType eventType, ValueContext context) { return eventType == null ? null : eventType.getText(); } }
使用时直接传入转换器实例即可:
binder.forField(eventType) .withNullRepresentation("None") .withConverter(new ChangelogEventTypeConverter()) .bind(ChangelogEvent::getEventType, ChangelogEvent::setEventType);
内容的提问来源于stack exchange,提问作者Ciby
相关产品推荐
相关产品推荐

