【问题标题】:How to make so, that exceptions don't thrown in Enum.valuesOf()?如何做到这一点,不会在 Enum.valueOf() 中引发异常?
【发布时间】:2020-12-18 15:47:53
【问题描述】:

我有类 BookSpecBuider 从 dto 创建 JPA 规范

BookSpecBuider 类:

public class BookSpecBuilder {
    public Specification<Book> getSpec(BookSearchDto bookSearchDto) {
        return (root, query, builder) -> {
            List<Predicate> predicates = new ArrayList<>();
            if (bookSearchDto.getGenre() != null) {
                predicates.add(root.get("genre").in(bookSearchDto.getGenre()));
            }
// another conditions

类型 是枚举类,所以我遇到了问题,在我的 BookSearchDto 流派是字符串并且映射有问题。

我在我的 if-block 中更改它:

predicates.add(root.get("genre").in(Genre.valueOf(bookSearchDto.getGenre())));

但是现在我遇到了异常问题,如果我得到类型字符串,我的枚举没有。 避免此问题的最佳方法是什么?

【问题讨论】:

  • 嗯...通过捕获和处理异常?
  • 我觉得不是很漂亮

标签: java jpa enums specifications


【解决方案1】:

我建议创建另一个名为 Unknown(或任何名称)的枚举条目,并在您的 Genre 枚举中创建一个新的静态方法调用 .of()(或您喜欢的任何名称),

enum Genre {    
    public static Genre of(String genre) {
        for(Genre g : values()) {
            if (g.name().equalsIgnoreCase(genre)) {
                return g;
            }
        }
        return Unknown;
    }
}

这样就可以避免不必要的异常了。

【讨论】:

  • 需要注意的是,Unknown 突然变成了genre 属性的有效值。需要调整业务逻辑以期待 Genre 的这个额外选项(例如,当创建 Book 时,可能需要额外验证以将 Unknown 排除为有效值等)
  • @crizzis 我在 if-block 的 BookSpecBuilder 中验证它。我同意你的看法,但我不知道避免所有这些问题的最佳方法。
猜你喜欢
  • 2013-09-12
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多