Как реализовать каскадные методы в Spring WebFlux

#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. Это было действительно полезно 🙂 Я просто застрял в этом беспорядке