【问题标题】:How to combine each element of a Flux with another Flux that needs an element's attribute如何将 Flux 的每个元素与另一个需要元素属性的 Flux 组合
【发布时间】:2021-08-05 01:37:51
【问题描述】:

我有一个关于 Spring WebFlux 和 Reactor 的问题。 我正在尝试编写一个简单的场景,在 GET 端点中我返回一个 Flux 代表实体的 DTO,每个实体都有一个集合 代表另一个实体的其他 DTO。以下是详细信息。

我有两个实体,Person 和 Song,定义如下:

@Data
public class Person {
    @Id
    private Long id;
    private String firstName;
    private String lastName;
}

@Data
public class Song {
    @Id
    private Long id;
    private String title;
    private Long authorId;
}

实体由以下 DTO 表示:

@Data
public class SongDTO {
    private Long id;
    private String title;
    public static SongDTO from(Song s) {
        // converts Song to its dto
    }
}

@Data
public class PersonDTO {
    private Long id;
    private String firstName;
    private String lastName;
    private List<SongDTO> songs = new ArrayList<>();
    public static PersonDTO from(Person p, List<Song> songs) {
        // converts person to its dto, invokes SongDTO.from on each song 
        // and adds the result to personDTO.songs
    }
}

我的服务(为简洁起见,此处未显示)确实返回 Mono 和 Flux。 然后我有以下 RestController:

@RestController
@RequestMapping("/people")
public class PersonController {
    @Autowired PersonService people;
    @Autowired SongService songs;
    
    @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
    public Flux<PersonDTO> findAllPeople() {
        return people.findAll()
                .map(person -> PersonDTO.from(person, /* HERE */ new ArrayList<>()));
        // TODO: find the songs of each author reactively and put the results in personDTO.songs
    }
}

现在,我的问题是:我该怎么做

  • 调用songs.findByAuthorId(person.getId())
  • 将返回的 Flux 转换为 SongDTO 列表
  • 在 PersonDTO 中设置列​​表 以被动的方式?

我试图查看 Reactor 的文档但没有成功,搜索了其他 StackOverflow 问题和 整个互联网,但找不到任何东西,很可能是因为我 不太确定如何表达我的搜索。 有人可以提供提示吗?

谢谢

【问题讨论】:

    标签: java spring-webflux project-reactor


    【解决方案1】:

    你可以使用flatMap + map:

    people.findAll()
          .flatMap(person -> songs.findByAuthorId(person.getId())
                                  .collectList()
                                  .map(songList -> PersonDTO.from(person, songList)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-24
      • 2020-01-04
      • 2020-07-30
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多