【问题标题】:How to return an object from Mono SpringWebFlux more effective?如何更有效地从 Mono Spring WebFlux 返回对象?
【发布时间】:2020-10-05 12:25:00
【问题描述】:

我用的是Spring Webflux,需要从Mono<Book>返回Author的对象,但是不知道怎么做更正确。

应该返回Author的方法:

private Author getRegistredAuthor(Book bookInput) {
    String fullName = bookInput.getAuthor().getFullName();
    Optional<Author> optionalAuthor = repository.findByFullName(fullName).blockOptional();
    if(optionalAuthor.isPresent()){
        return optionalAuthor.get();
    }else {
        Author author = Author.builder().fullName(fullName).build();
        return repository.insert(author).block();
    }
}

使用Author创建新实体的方法:


public Mono<BookDto> create(@RequestBody Book book) {
    book.setAuthor(getRegistredAuthor(book));
    return bookRepository.insert(book)
            .map(BookDto::of);
}

据我了解,如果我使用block(),我会大大降低reactive的有效性。

这样用会不会更有效?

return repository.insert(author).blockOptional().get();

如何返回Author 的对象最有效?

【问题讨论】:

  • 返回Mono&lt;Author&gt;,完全不要屏蔽。
  • @123 我需要Author,因为这个方法是用来创建其他实体的
  • 那么其他实体需要由 Mono 制作。要么一切都是被动的,要么毫无意义。
  • @123 但我不明白该怎么做。在其他地方我使用了.map (BookDto :: of),但如果我不需要dto,我不知道如何应用它,而是BookAuthor本身
  • 只是不要映射它......

标签: spring-boot reactive-programming spring-webflux


【解决方案1】:

应该这样做..

private Mono<Author> getRegistredAuthor(String fullName) {
    Mono<Author> optionalAuthor = repository.findByFullName(fullName); // .blockOptional();
    optionalAuthor
    .switchIfEmpty({
        Author author = Author.builder().fullName(fullName).build();
        return repository.insert(author).
    })
    .flatMap(author -> author);
}

【讨论】:

  • 我需要返回Author ,因为这个方法是用来创建其他实体的
  • 我建议..return Mono,并在您使用此方法的地方使用mapflatmap 获取Author 对象
  • 它看起来确实像我需要的,但我不明白该怎么做。在其他地方我使用了.map (BookDto :: of),但如果我不需要dto,我不知道如何应用它,而是BookAuthor本身
【解决方案2】:

因此,我使用 Mono.zip 解决了我的问题。也许我的解决方案也会对某人有所帮助:

    @PostMapping("/api/book")
    public Mono<BookDto> create(@RequestBody Book book) {
        return getObjectMono(book).flatMap(b -> bookRepository.insert(book))
                .map(BookDto::of);
    }


    private Mono<Object> getObjectMono(Book book) {
        return Mono.zip(
                getRegistredAuthor(book),
                getRegistredGenre(book)
        ).map(objects -> {
            book.setAuthor(objects.getT1());
            book.setGenre(objects.getT2());
            return book;
        });
    }

    private Mono<Genre> getRegistredGenre(Book bookInput) {
        String genreTitle = bookInput.getGenre().getTitle();
        return genreRepository.findByTitle(genreTitle)
                .switchIfEmpty(
                        genreRepository.insert(Genre.builder().title(genreTitle).build())
                );
    }

    private Mono<Author> getRegistredAuthor(Book bookInput) {
        String fullName = bookInput.getAuthor().getFullName();
        return authorRepository.findByFullName(fullName)
                .switchIfEmpty(
                        authorRepository.insert(Author.builder().fullName(fullName).build())
                );
    }

【讨论】:

    猜你喜欢
    • 2019-12-14
    • 2021-05-08
    • 2018-09-21
    • 1970-01-01
    • 2021-11-03
    • 2018-12-19
    • 2020-03-22
    • 2020-11-20
    • 1970-01-01
    相关资源
    最近更新 更多