如何基于中间数据验证来停止反应堆运行链

问题描述 投票:0回答:1

在reactor操作链中,它首先向另一台服务器查询响应,然后根据响应字段,继续reactor

Mono
链或停止。在使用reactor之前,我经常使用
if else
来控制是否继续。但是,以下代码将针对
map(any -> null)
抛出 NPE。我可以将下一个
map
的主体放入
if else
中,但那样它不是反应器链。那么如何根据数据验证来停止反应堆运行链呢?基本上,我希望它可以是
Mono.empty
map(any -> null)

    private Mono<MyResponse> post() {
        return client.post()
                .uri("/somepath")
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON)
                .body(new MyRequest(), MyRequest.class)
                .retrieve()
                .bodyToMono(MyResponse.class);
    }


Slice<MyEntity> allBy = myRepository.findAll(pageable);
Flux.fromIterable(allBy.getContent())
                    .flatMap(entity -> {
                        return this.post()
                                .map(response-> {
                                    String img = response.getImg();
                                    if (img ==null || img.equals("")) {
                                        return null;
                                    } else {
                                        return new AnotherVo();
                                    }
                                })
                                .map(anotherVo-> {
                                    entity.setField(anotherVo.getField());
                                    myRepository.save(entity);
                                    return 1;
                                });
                    }).reduce(Integer::sum)
                    .block();

spring-webflux project-reactor
1个回答
1
投票

也许您正在寻找的是基于某些属性使用过滤操作。 例如:

.flatMap(entity -> {
                    return this.post()
                            .filter(response-> response.getImg() != null && !response.getImg().equals(""))
                            .map(any -> {
                                var anotherVo = new AnotherVo();
                                entity.setField(anotherVo.getField());
                                myRepository.save(entity);
                                return 1;
                            });
                })

请注意,只有当过滤器发出一些非空信号时,映射才会被执行。如果您想添加后备值,只需使用

.switchIfEmpty(value)

© www.soinside.com 2019 - 2024. All rights reserved.