Vaadin:在 Vaadin 8 中将枚举值绑定到字符串

Vaadin: Bind Enum values to String in Vaadin 8

我正在努力将我们的应用程序 vaadin 版本从 7.7.24 升级到 8.13.3。我们已经解决了所有的依赖问题,我可以在本地启动应用程序了。

我们有一个显示事件数据的文本框。

这是我正在使用的 class 文件:

@Entity
@Table(name = "changelog")
public class ChangelogEvent extends BaseEntity
{
@Column(name = "remote_ip")
private String remoteIp;
@Column(name = "remote_host")
private String remoteHost;
@Column(name = "event")
@Enumerated(EnumType.ORDINAL)
private ChangelogEventType eventType;

@Column(name = "entity_type")
private String entityType;

public ChangelogEvent()
{
}
public ChangelogEvent(String remoteIp, String remoteHost, ChangelogEventType eventType)
{
this.remoteIp = remoteIp;
this.remoteHost = remoteHost;
this.eventType = eventType;
}
public String getRemoteIp()
{
return remoteIp;
}
public void setRemoteIp(String remoteIp)
{
this.remoteIp = remoteIp;
}
public ChangelogEventType getEventType()
{
return eventType;
}
public void setEventType(ChangelogEventType eventType)
{
this.eventType = eventType;
}
public String getRemoteHost()
{
return remoteHost;
}
public void setRemoteHost(String remoteHost)
{
this.remoteHost = remoteHost;
}
public String getEntityType()
{
return entityType;
}
public void setEntityType(String entityType)
{
this.entityType = entityType;
}

}

这是我的 ChangelogEventType.java 文件,它定义了 ChangelogEventType 枚举:

public enum ChangelogEventType
{
CREATED("Created"),
UPDATED("Updated"),
DELETED("Deleted"),
LOGIN("Login"),
LOGOUT("Logout"),
LOGIN_RETRY("Login Retry"),
ACCOUNT_LOCKED("Account Locked"),
PASSWORD_EXPIRED("Password Expired"),
PASSWORD_CHANGED("Password Changed");
private String text;
ChangelogEventType(String text)
{
this.text = text;
}
public String getText()
{
return text;
}
public static ChangelogEventType fromString(String text)
{
if (text != null)
{
for (ChangelogEventType event : ChangelogEventType.values())
{
if (text.equalsIgnoreCase(event.text))
{
return event;
}
}
}
return null;
}
}

这是我用于将值绑定到文本字段的代码。

eventType = createTextField("Event", COLUMN_WIDTH);
binder.forField(eventType)
        .withNullRepresentation("None")
        .bind(ChangelogEvent::getEventType, ChangelogEvent::setEventType);

有什么方法可以将枚举绑定到文本框吗?

您需要编写自定义转换器并使用 withConverter 方法在 Binder 中使用它,在您的情况下类似于:

class StringToChangelogEventTypeConverter implements Converter<String, ChangelogEventType> {
  @Override
  public Result<ChangelogEventType> convertToModel(String fieldValue, ValueContext context) {
    // Produces a converted value or an error
    ChangelogEventType event = ChangelogEventType.fromString(fieldValue);
    if (event != null) {
      // ok is a static helper method that creates a Result
      return Result.ok(ChangelogEventType.fromString(fieldValue));
    } else {
      // error is a static helper method that creates a Result
      return Result.error("Please enter a number");
    }
  }

  @Override
  public String convertToPresentation(ChangelogEventType event, ValueContext context) {
    // Converting to the field type should always succeed,
    // so there is no support for returning an error Result.
    return event.getText();
  }
}