#java #spring #reactive-programming #spring-webflux #project-reactor
#java #весна #реактивное программирование #пружина-webflux #проект-реактор
Вопрос:
У меня есть простое CRUD-приложение с объектами авторского, жанрового, комментариевого и книжного доменов. Вот в чем проблема: я не могу правильно реализовать метод обновления. У меня есть контроллер для каждой сущности с отображением put, который вызывает метод обновления сервиса с аргументами и возвращает его результат. Но потом я вручную проверяю это, эффекта нет. Похоже, что эти методы даже не вызываются. Я знаю, что реактивные потоки ленивы, но они все равно должны быть выполнены, иначе я что-то пропустил. Вот мой метод обновления BookService.
public Mono<Tuple2<Flux<Comment>, Book>> updateBook(String id, String title, String authorNameParameter,
String genreNameParameter) {
return bookRepository.findById(id)
.map(b -> commentRepository.saveAll(commentRepository.findByBook_Title(b.getTitle())
.flatMap(c -> Mono.just(c.setBook(title)))))
.zipWith(bookRepository.findById(id).flatMap(b -> getAuthor(authorNameParameter)
.flatMap(a -> Mono.just(b.setAuthor(a)))
.flatMap(book -> Mono.just(book.setTitle(title)))
.flatMap(book -> getGenre(genreNameParameter)
.flatMap(g -> Mono.just(book.setGenre(g))))));
}
И то же самое на Авторском сервисе:
public Mono<Tuple2<Flux<Book>, Author>> updateAuthor(String id, String name) {
return authorRepository.findById(id)
.map(a -> bookRepository.findByAuthor_Id(a.getId())
.flatMap(b -> Mono.just(b.setAuthor(a.setName(name)))).flatMap(bookRepository::save))
.zipWith(authorRepository.findById(id).flatMap(a -> Mono.just(a.setName(name)))
.flatMap(authorRepository::save));
}
И жанровое обслуживание:
public Mono<Tuple2<Flux<Book>, Genre>> updateGenre(String id, String name) {
return genreRepository.findById(id)
.map(g -> bookRepository.findByGenre_Id(g.getId())
.flatMap(b -> Mono.just(b.setGenre(g.setName(name)))).flatMap(bookRepository::save))
.zipWith(genreRepository.findById(id).flatMap(g -> Mono.just(g.setName(name)))
.flatMap(genreRepository::save));
}
AuthorService и GenreService обновляют объекты author / genre, но не обновляют book, BookService ничего не делает. Я просто хочу обновить связанные объекты (жанр -> книга, автор -> книга, книга -> комментарий).
Установщик просто создает новый экземпляр с изменениями, это более удобно для реактивного программирования.
Итак, последний вопрос: как реализовать каскадное обновление с помощью Spring WebFlux в моем случае. Может быть, у меня есть какое-то непонимание реактивной концепции.
Комментарии:
1. код довольно сложен для понимания, попробуйте разделить его на несколько функций, и вы, вероятно, обнаружите, где вам не хватает возврата.
2. Это было действительно полезно 🙂 Я просто застрял в этом беспорядке