Witam wszystkich, to mój pierwszy post na grupie, programuje w Javie hobbistycznie i natrafiłem na małą blokadę w moim projekcie.
Napisałem sobie feature do aktualizacji mojej encji Book. Encja Book podczas dodawania do systemu jest walidowana w DTO przez interfejs Validation z biblioteki Vavr. Bardzo spodobało mi się podejście @danek z ResponseResolver i enum jako zwracany błąd. Tylko w tym przypadku nie wiem czy nie przekombinowałem i może tą walidację lepiej przepisać na jakiegoś Hibernate Validator z @Valid
i uniknąć tych wszystkich problemów, ale chciałem spróbować czegoś innego. Doszedłem jeszcze do jednego wniosku, że w tej walidacji niepotrzebnie waliduję chyba wszystkie pola z warunkami takimi jak długość tytułu, autora książki, jakie macie podejście w tej kwestii ? Najważniejszym polem jest kod ISBN i może tylko na tym polu się skupić i zrobić proste sprawdzenie, które będzie zwracać BookError z ISBN_IS_INVALID i wtedy problem jest tak naprawdę rozwiązany bo mam wszystkie błędy typy BookError.
Flow wygląda następująco:
Przekazuję do metody od aktualizacji encji BookUpdateDto i bookId. Znajduje encje za pomocą findById i robię na niej update. I tutaj jest problem, bo findById zwraca mi Either<BookError, BookCreateDto>
(gdy nie ma książki o danym id zwraca BOOK_NOT_FOUND
), a chciałbym jeszcze walidować przed update moje BookUpdateDto
, które zwraca Validation
.
Mógłby mi ktoś udzielić wskazówki jak zrobić mapowanie dla tych błędów, aby uniknąć jakiegoś zagnieżdżenia w stylu Either<BookError, Validation<Seq<String>, BookCreateDto>
.
Metoda update mapuje BookUpdateDto
na encje book za pomocą Buildera. Link to kodu gdzie jest metoda: tutaj.
Kod:
public Either<BookError, BookCreateDto> updateBookById(final Long bookId, final BookUpdateDto toUpdate) {
return findBookById(bookId)
.toEither(BOOK_NOT_FOUND)
.map(book -> bookValidation.validate(book.response()))
.map(book -> book.update(toUpdate))
.map(book -> bookRepository.save(book).response());
}
Jeszcze jest tam sporo rzeczy, które muszę poprawić, ale przy okazji jeśli ktoś ma ochotę spojrzeć na mój projekt i wskazać błędy, coś poradzić czy idę w dobrym kierunku to będę mega wdzięczny!