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

Spring注解@CreatedBy与@CreatedDate失效,@LastModified相关注解正常

问题

创建MongoDB文档类时,通过Spring Data注解自动填充creationDate、lastModifiedDate、createdBy和lastModifiedBy字段,仅@CreatedBy和@CreatedDate标注的字段值为null,@LastModifiedBy和@LastModifiedDate可正常填充。

关联代码

RoleMapping.java

import com.abcd.ops.cp.bo.BaseDBEntity;
import lombok.*;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import java.util.Set;

@Document
@Getter
@Setter
@NoArgsConstructor
@Builder
public class RoleMapping extends BaseDBEntity {

    @Id
    private String roleName;

    private Set<RBACEntity> entities;

    private String description;

    private RoleType roleType = RoleType.SYSTEM_DEFINED;

    @Builder
    public RoleMapping(String roleName, Set<RBACEntity> entities, String description, RoleType roleType) {
        super(roleName);
        this.roleName = roleName;
        this.entities = entities;
        this.description = description;
        this.roleType = roleType;
    }
}

BaseDBEntity.java

package com.abcd.ops.cp.bo;

import lombok.*;
import org.springframework.data.annotation.*;

import java.util.Date;

@Getter
@Setter
@NoArgsConstructor
public abstract class BaseDBEntity {

    @CreatedBy
    private String createdBy;

    @CreatedDate
    private Date creationDate;

    @LastModifiedDate
    private Date lastModifiedDate;

    @LastModifiedBy
    private String lastModifiedBy;
}
解决方法
  1. 启用Mongo审计功能
    在Spring配置类(或主启动类)上添加@EnableMongoAuditing注解,确保Spring Data MongoDB的审计拦截器生效。

  2. 配置AuditorAware Bean
    @CreatedBy依赖AuditorAware接口实现来获取当前操作用户,未配置时该字段会为null。示例配置:

    @Configuration
    @EnableMongoAuditing
    public class MongoAuditConfig {
        @Bean
        public AuditorAware<String> auditorProvider() {
            // 替换为实际获取当前用户的逻辑,比如从SecurityContext中提取
            return () -> Optional.of("default-user");
        }
    }
    
  3. 使用Repository的save方法
    如果通过@Builder手动构建实体后直接插入数据库,审计逻辑可能未触发。必须调用MongoRepository提供的save()方法来保存实体,确保审计拦截器能处理创建时间和创建人字段。

  4. 检查注解与权限

    • 确认使用的是org.springframework.data.annotation包下的@CreatedDate和@CreatedBy注解,避免导入错误包。
    • 实体字段的getter/setter方法已生成(代码中@Getter/@Setter已满足要求),确保审计逻辑能正常访问并修改字段值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 09:01:29