У меня есть класс 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, которого нет в моем перечислении. Каков наилучший способ избежать этой проблемы?
мне кажется это не очень красиво
Я бы предложил создать еще одну запись перечисления с именем 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 Я проверяю это в BookSpecBuilder в блоке if. Я согласен с вами, но я не знаю, как лучше всего избежать всех этих проблем.
Ммм... перехватывая и обрабатывая исключение?