You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoTemplate执行save操作时是否不会调用实体类的getter方法?

问题结论

首先明确:你观察到的现象符合Spring Data MongoDB的默认行为,MongoTemplate执行save操作时默认不会调用实体类的getter方法获取字段值。

原因说明

你使用的Spring Boot 1.5.10对应Spring Data MongoDB 1.10.x版本,该版本的实体映射默认采用字段访问策略(FIELD access):框架会直接通过反射读取类的私有字段值,完全绕过getter方法,因此你自定义的getWriter()逻辑不会在序列化存库的过程中生效。

解决方案

如果要让自定义的getter逻辑在存库时生效,可以选择以下任意一种方案:

  • 方案1:为实体类指定属性访问策略
    在MyObject类上添加@AccessType(Type.PROPERTY)注解(注解全类名:org.springframework.data.annotation.AccessType),配置后框架会通过调用getter方法获取字段值,你写的校验逻辑就会生效。
    示例代码:
    @Getter
    @Setter
    @ToString
    @NoArgsConstructor
    @Document(collection = "myCollection")
    @AccessType(Type.PROPERTY) // 新增配置
    public class MyObject{
        // 原有代码保持不变
    }
    
  • 方案2:保存前手动处理字段值
    在调用mongoTemplate.save()方法之前,手动判断writer的nickName是否为空,满足条件则直接将实体的writer字段设为null,无需修改访问策略也能达到预期效果。
  • 方案3:自定义序列化转换器
    如果同类校验逻辑需要复用在多个实体上,可以自定义Converter<MyObject, org.bson.Document>实现类,手动控制实体到BSON的转换逻辑,注册到Mongo的映射转换器中即可。

内容的提问来源于stack exchange,提问作者10000sukk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:09:01