1
public Mono<EmailDto> getEmail() {
Mono<EmailService> emailService = ReactiveSecurityContextHolder.getContext()
                    .map(securityContext -> (Principal) securityContext.getAuthentication().getPrincipal())
                    .map(principal -> emailServiceSelector.selectSuitable(principal.getInfo()));

return emailService.map(service -> service.findInfoByEmail(dto.getManagerEmail())) }

但是我对这种方法有一个问题,因为 emailService.map(service -> service.findInfoByEmail(dto.getManagerEmail()))返回Mono<Mono<EmailDto>>. 的实现findInfoByEmail(String email)

public Mono<EmailDto> findInfoByEmail(String email) {
        return webClient.get()
                .uri(emailServiceProperties.getUrl(), email)
                .retrieve()
                .bodyToMono(EmailDto.class);
}

我的方法返回Mono<EmailDto>,不是Mono<Mono<EmailDto>>。所以,我的问题是:如何转换Mono<Mono<EmailDto>>Mono<EmailDto>?或者 mb 我完全错了,方法应该返回Mono<Mono<EmailDto>>?期待任何帮助。

4

2 回答 2

0

平面地图和地图 是有区别的。flatMap应该用于非阻塞操作,或者简而言之,任何返回 Mono、Flux 的操作。 当您想在固定时间内对对象/数据进行转换时,应使用map 。同步完成的操作。

findInfoByEmail正在拨打异步电话。

因此,您应该使用:

return emailService.flatMap(service -> service.findInfoByEmail(dto.getManagerEmail())) }

这是来自官方文档

平面图 地图

于 2020-07-20T16:54:17.240 回答
0

您所做的一切都是正确的,但您需要使用 flatMap() 代替 map()。map 用于将特定对象转换为其他对象,而在您的情况下, flatMap() 用于将所有 1 到 N 个对象转换为 Mono。因此,您可以使用以下代码段:-

返回 emailService.flatMap(service -> service.findInfoByEmail(dto.getManagerEmail())) }

于 2020-12-16T07:59:36.743 回答