【问题标题】:Implement filter for Enum to check value before insert为 Enum 实施过滤器以在插入前检查值
【发布时间】:2020-06-13 21:37:43
【问题描述】:

我想将可用的用户角色存储到 Enum 中:

public enum Role implements GrantedAuthority {
  ROLE_ADMIN, ROLE_CLIENT;

  public String getAuthority() {
    return name();
  }

}

实体值:

@Column(length = 25)
@Enumerated(EnumType.STRING)
private Role role;

我使用代码创建新用户:

Users user = new Users();
user.setRole(Role.valueOf("ROLE_ADMIN"));

有没有办法检查 ROLE_ADMIN 是否是一个有效的枚举值,因为我可以破坏代码它不是一个有效的值。

【问题讨论】:

  • valueOf 如果字符串与值不匹配,将抛出IllegalArgumentException,因此您可以抓住它。这就是通常的检查方式。
  • @racraman 为什么不回答您的评论?
  • 不确定是什么问题。如果要创建Users 的新实例,可以直接使用setRole(Role.ROLE_ADMIN)。如果真的,rol 值以“字符串方式”“来自”前端应用程序(或其他来源),那么也许您可以在此处包含该代码以更好地帮助您。
  • 是的,在我的情况下,值来自 Angular 作为字符串,所以我需要对收到的值进行一些检查。
  • @PeterPenzov 你觉得我的回答怎么样?

标签: java hibernate enums


【解决方案1】:

您可以在您的枚举中创建一个特定的方法,以了解提供的字符串是否与特定的字符串匹配。比如:

public static Optional<Role> getFromString(String valueToCheck) {
  return Optional.ofNullable(valueToCheck)
            .flatMap(toCheck -> Arrays.stream(Role.values())
                       .filter(r -> toCheck.equals(r.name()))
                       .findFirst());
}

或使用上述方法的另一种方法:

  1. Optional&lt;Role&gt; 更改为Role 并使用.orElse(null)
  2. Optional&lt;Role&gt; 更改为Role 并使用.orElseThrow(...) 引发异常。

【讨论】:

    猜你喜欢
    • 2011-02-18
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    相关资源
    最近更新 更多