Как сделать так, чтобы в Enum.valuesOf() не бросались исключения?

У меня есть класс BookSpecBuider, который создает спецификацию JPA из dto.

Класс 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

Жанр является enum-class, поэтому у меня была проблема, что в моем BookSearchDto Genre есть String, и у него были проблемы с отображением.

Я меняю его в своем блоке if:

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

Но теперь у меня проблема с исключениями, если я получаю String of Genre, которого нет в моем перечислении. Каков наилучший способ избежать этой проблемы?

Ммм... перехватывая и обрабатывая исключение?

crizzis 19.12.2020 10:12

мне кажется это не очень красиво

petrov.aleksandr 19.12.2020 11:32
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
2
135
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я бы предложил создать еще одну запись перечисления с именем Unknown (или любое имя) и создать новый вызов статического метода .of() (или любое имя, которое вы предпочитаете) внутри вашего перечисления Genre,

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 19.12.2020 13:25

@crizzis Я проверяю это в BookSpecBuilder в блоке if. Я согласен с вами, но я не знаю, как лучше всего избежать всех этих проблем.

petrov.aleksandr 19.12.2020 14:36

Другие вопросы по теме