使用WebClient调用外部API存MongoDB时图片字段无法保存如何解决?
图片字段无法存入MongoDB问题排查及解决方案
常见原因排查顺序
- 反序列化阶段字段丢失
首先在bodyToMono(ClientList.class).block()拿到结果后,直接断点或打印ClientList.getData()里每个Clients对象的image1、image2值,确认反序列化后字段是否有值。
若此处字段为空,排查以下点:Clients类的getter/setter方法是否正确:需保证image1、image2对应get/set方法名称大小写匹配,例如getImage1()、setImage1(String image1),方法名错误会导致Jackson无法完成字段赋值。- 类型转换异常导致反序列化失败:接口返回的
id是字符串类型、date是字符串类型,但实体类中对应字段是Long和Timestamp,若没有配置对应的类型转换器,反序列化时会抛出异常,你当前的WebClient没有配置错误捕获逻辑,异常可能被直接忽略导致字段为空。 - Jackson序列化配置问题:确认全局Jackson配置没有开启忽略字符串类型字段,或字段上没有加
@JsonIgnore、@JsonIgnoreProperties等注解排除了image字段。
- 实体转换阶段字段丢失
若反序列化后的Clients对象已经有image1、image2值,问题出在你后续转ClientDto的逻辑中:
你当前代码中map(product -> fill(client, id))的fill方法,大概率遗漏了对image1、image2字段的赋值,需要在fill方法中补充把源Clients对象的image字段赋值到目标ClientDto对应字段的逻辑。 - 存储阶段异常
虽然你认为问题不在存储层,仍建议给存储逻辑添加错误日志,确认是否有字段类型不匹配导致的存储失败:clientRepository.saveAll(clientList) .doOnComplete(() -> log.info("存储完成,共{}条", clientList.size())) .doOnError(e -> log.error("存储失败", e)) // 新增错误日志 .subscribe()
对应解决方案
- 先验证反序列化结果,确认字段丢失的阶段。
- 若反序列化失败:
- 把
Clients类的id字段改为String类型,或添加@JsonDeserialize(using = LongJsonDeserializer.class)注解完成字符串到Long的转换。 - 给
date字段添加日期格式化注解,示例:
或临时改为@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Timestamp date;String类型验证,确认反序列化是否正常。 - 把
- 若实体转换阶段丢失:补充
fill方法中image字段的赋值逻辑。 - 确认
ClientDto类中存在image1、image2字段,以及对应的getter/setter方法。
内容的提问来源于stack exchange,提问作者AlexWhite
相关产品推荐
相关产品推荐

