如何将 Flux 的每个元素与需要元素属性的另一个 Flux 组合
How to combine each element of a Flux with another Flux that needs an element's attribute
我有一个关于 Spring WebFlux 和 Reactor 的问题。
我正在尝试编写一个简单的场景,在 GET 端点中我 return 一个 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
}
}
我的服务(为简洁起见未在此处显示)return 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())
- 将 returned Flux 转换为 SongDTO 列表
- 在 PersonDTO 中设置列表
以一种被动的方式?
我试图查看 Reactor 的文档但没有成功,搜索了其他 Whosebug 问题并
整个互联网,但找不到任何东西,很可能是因为我
不太确定如何表述我的搜索。
有人可以提供提示吗?
谢谢
您可以使用 flatMap
+ map
:
people.findAll()
.flatMap(person -> songs.findByAuthorId(person.getId())
.collectList()
.map(songList -> PersonDTO.from(person, songList)));
我有一个关于 Spring WebFlux 和 Reactor 的问题。 我正在尝试编写一个简单的场景,在 GET 端点中我 return 一个 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
}
}
我的服务(为简洁起见未在此处显示)return 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())
- 将 returned Flux 转换为 SongDTO 列表
- 在 PersonDTO 中设置列表 以一种被动的方式?
我试图查看 Reactor 的文档但没有成功,搜索了其他 Whosebug 问题并 整个互联网,但找不到任何东西,很可能是因为我 不太确定如何表述我的搜索。 有人可以提供提示吗?
谢谢
您可以使用 flatMap
+ map
:
people.findAll()
.flatMap(person -> songs.findByAuthorId(person.getId())
.collectList()
.map(songList -> PersonDTO.from(person, songList)));