如何通过返回Mono的数据库调用为Flux中的每个对象进行连接



我有两个数据库调用,一个返回Flux,另一个返回Mono

LegacyPerson类包含一个legacyPersonId和一个名称。PersonKey类包含和legacyPersonId以及一个PersonID

我想得到一个Mono<列表>其中Person类包含legacyPersonId和PersonId。因此,我必须在不阻塞的情况下确定每个处于变化中的legacyPerson的id。

class LegacyPerson {
Integer legacyId;
String name;
}
@Builder
class Person {
UUID id;
Integer legacyId;
String name;
}
class PersonKey {
UUID id;
Integer legacyId;
} 

两个存储库:

@Repository
public interface RepositoryKey extends ReactiveCrudRepository<PersonKey, UUID> {
Mono<PersonKey> findByPensioennummer(Integer pensioennummer);
}
@Repository
public interface RepositoryPerson extends ReactiveCrudRepository<LegacyPerson, UUID> {
Flux<LegacyPerson> findByName(String name);
}

这就是我尝试过的

class Service {
RepositoryKey repKey;
RepositoryPerson repPerson;
public Mono<List<Person>> getPersons(String name) {
Flux<LegacyPerson> legacyPersonFlux = repPerson.findByName(name);
legacyPersonFlux.map(person -> map(repKey.findByPensioennummer(person.legacyId), person));
}
private Person map(UUID id, LegacyPerson legacyPerson) {
return Person.builder().id(id).name(legacyPerson.name).legacyId(legacyPerson.legacyId).build();
}
}

我得到一个错误,map方法需要一个UUID而不是Mono。我可以将其更改为Mono,但我不想更改域对象Person中的Id。

如有任何帮助,我们将不胜感激!

这没有意义。公共CCD_ 1不是反应性的。你至少需要public Mono<Person> getPerson(String name)。此外,如果Flux<LegacyPerson> findByName(String name)返回多个结果,您打算怎么办?首先考虑将其更改为Mono<LegacyPerson> findByName(String name)

RepositoryKey repKey = new RepositoryKey();;
RepositoryPerson repPerson = new RepositoryPerson();
public Mono<Person> getPerson(String name) {
Flux<LegacyPerson> legacyPersonFlux = repPerson.findByName(name);

return  legacyPersonFlux.next()
.flatMap(legacyPerson -> repKey.findByPensioennummer(legacyPerson.legacyId).map(pk->map(pk.id, legacyPerson)));
}
private Person map(UUID id, LegacyPerson legacyPerson) {
return Person.builder().id(id).name(legacyPerson.name).legacyId(legacyPerson.legacyId).build();
}   
private void run() {
getPerson("me").subscribe(System.out::println);
}

static class LegacyPerson {
Integer legacyId;
String name;
}
@Builder
@Data
static class Person {
UUID id;
Integer legacyId;
String name;
}
static class PersonKey {
UUID id;
Integer legacyId;
}
public class RepositoryKey {
Mono<PersonKey> findByPensioennummer(Integer pensioennummer) {
PersonKey pk = new PersonKey();
pk.legacyId = pensioennummer;
pk.id = UUID.randomUUID();
return Mono.just(pk);
}
}
public class RepositoryPerson {
Flux<LegacyPerson> findByName(String name) {
LegacyPerson lp = new LegacyPerson();
lp.legacyId = 1;
lp.name = name;
return Flux.just(lp); 
}
}

最新更新