我有两个数据库调用,一个返回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);
}
}