Webflux中Filter条件未按预期生效,求调试建议
Filter条件未生效始终进入switchIfEmpty分支的调试建议
代码片段
import org.springframework.util.CollectionUtils; private Flux<String> getReplay(final Replay replay) { return Mono.just(replay) .doOnNext(replay -> log.info("MSG='before checking''")) .filter(replay -> !CollectionUtils.isEmpty(replay.getIds())) .flatMapMany(replay1 -> replayWithIds(replay)) .switchIfEmpty(replayService.findAllByCriteria(replay.getCriteria())); }
示例输入数据
{ "uniqueId" : "fomeUniqueId", "status" : "RUNNING", "traceId" : "trace_id", "effectiveDateTime" : "2021-03-04T10:40:00Z", "ids" : [ "ABC123", "1234" ] }
调试步骤建议
- 在
doOnNext中新增日志,打印replay.getIds()的实际值:log.info("Replay ids value: {}", replay.getIds()),确认传入的Replay对象中ids字段是否真的非空 - 检查
Replay实体类的getIds()实现,以及JSON反映射配置:确认实体类中ids字段和JSON里的ids是否正确绑定,有没有字段名拼写错误或者注解配置问题 - 验证
*CollectionUtils.isEmpty*的逻辑:该方法对null和空集合都会返回true,所以!CollectionUtils.isEmpty(replay.getIds())要求ids既不是null也不是空集合,确认是否符合你的预期 - 修复
flatMapMany中的变量引用错误:当前代码里用了外部的replay而非过滤后的replay1,虽然逻辑上是同一对象,但改成replayWithIds(replay1)可以避免潜在的变量引用问题,再重新测试 - 在
filter之后添加doOnNext日志:.filter(...) .doOnNext(r -> log.info("Filter passed, ids: {}", r.getIds())),如果这条日志没打印,说明元素确实被filter过滤掉了,重点排查过滤条件 - 检查实际请求的JSON格式:示例数据里出现了中文引号(
“),如果实际请求用了中文引号,会导致反序列化失败,ids字段变为null,确认请求的JSON使用的是英文双引号 - 排查
switchIfEmpty的触发逻辑:只有当前面的Flux没有任何元素时才会触发,所以如果filter过滤了元素,必然会走到这里,核心还是确认filter的判断逻辑和实际传入数据是否匹配
内容的提问来源于stack exchange,提问作者LowCool
相关产品推荐
相关产品推荐

