如何在SpringWebflux中将Mono对象转换为其他Mono对象



我有一个类似的类

public class Person {
private String name;
private String age;
private Boolean student;
...
//
getters and setters
}
public class PersonDto {
private List<Person> persons
private Person president
//
getters and setters
}

并从外部API 获取数据到网络客户端

--- omitted ---
final Mono<PersonDto> personDto = wrapperWebClient.getPersonDto(uriComponents, params, PersonDto.class);
Mono<StudentDto> studentDto = convert(personDto);
--- omitted ---

我想转换数据单声道DTO如下。

public class Student {
// no constructors 
private String name;
private String age;
private Boolean student;
...
//
getters and setters
}
public class StudentDto {
private List<Student> students;
private Student represent;
...
//
getters and setters
}

这是我的尝试

--- omitted ---
private Mono<StudentDto> convert(Mono<PersonDto> personDto) {
StudentDto studentDto = new StudentDto();
personDto.map(
persons -> {
studentDto.setStudents(
persons.getPersons()
.stream().filter(person -> person.isStudent())
.collect(toList())
);
studentDto.setRepresent(
persons.getRepresent().isStudent()
);
}
)
return ???;
} 

我的方法似乎是同步的。

只返回带有地图的Mono

private Mono<StudentDto> convert(Mono<PersonDto> personDto) {
return personDto.map(
persons -> {
StudentDto studentDto = new StudentDto();
studentDto.setStudents(
persons.getPersons()
.stream().filter(person -> person.isStudent())
.collect(toList())
);
studentDto.setRepresent(
persons.getRepresent().isStudent()
);
}
);
} 

CCD_ 2和CCD_ 3的主要区别在于同步性

如果要处理另一个异步的,请使用flatMap

或者,如果您只想重新格式化Mono/Flux的输出,请使用map

使用flatMap。这是基本的reactor,在询问堆栈溢出之前,您应该通读Getting started reactor。

private Mono<StudentDto> convert(Mono<PersonDto> personDto) {
return personDto.flatMap(personDto -> {
final StudentDto studentDto = new StudentDto();
studentDto.setStudents(
persons.getPersons()
.stream().filter(person -> person.isStudent())
.collect(toList())
);
studentDto.setRepresent(
persons.getRepresent().isStudent()
);
return Mono.just(studentDto);
})
} 

Mono类中有transform方法。

return Mono.fromFuture(step1.callFuture(input))
.doOnSuccess(this::logJsonInput)
.transform(otherService::calculate);

其中

OtherService {
public Mono<Result> calculate(Mono<Step1Output> input) {
//...
}       
}

最新更新