当前使用版本(必填,否则不予处理)

3.3.2 springboot 2.3.1

该问题是如何引起的?(确定最新版也有问题再提!!!)

注入更新字段不生效,回退至3.3.1 版本没有问题

重现步骤(如果有就写完整)

报错信息

Comment From: miemieYaho

给出你的复现demo

Comment From: Goldwood1024

-- 填充字段

    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private Date createTime;

    /**
     * 创建人
     */
    @TableField(value = "create_by_id", fill = FieldFill.INSERT)
    private String createById;

    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    /**
     * 更新人
     */
    @TableField(value = "update_by_id", fill = FieldFill.INSERT_UPDATE)
    private String updateById;

--- 配置类

Slf4j
@Service
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(MetaObjectHandler.class)
public class MpMetaObjectConfiguration implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        String id = WebUtils.getClientUId();
        if (log.isDebugEnabled()) {
            log.debug("SQL-Insert自动填充请求用户ID:[{}]", id);
        }

        this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "createById", String.class, id);
        this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "updateById", String.class, id);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        String id = WebUtils.getClientUId();
        if (log.isDebugEnabled()) {
            log.debug("SQL-Update自动填充请求用户ID:[{}]", id);
        }
        this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
        this.strictUpdateFill(metaObject, "updateById", String.class, id);
    }
}

执行更新操作后 最终进入这里,因为 updateTime 有值,直接返回 this


/**
     * 严格模式填充策略,默认有值不覆盖,如果提供的值为null也不填充
     *
     * @param metaObject metaObject meta object parameter
     * @param fieldName  java bean property name
     * @param fieldVal   java bean property value of Supplier
     * @since 3.3.0
     */
    default MetaObjectHandler strictFillStrategy(MetaObject metaObject, String fieldName, Supplier<Object> fieldVal) {
        if (metaObject.getValue(fieldName) == null) {
            Object obj = fieldVal.get();
            if (Objects.nonNull(obj)) {
                metaObject.setValue(fieldName, obj);
            }
        }
        return this;
    }

updateTime填充要怎么处理????? 谢谢

Comment From: miemieYaho

  1. 重写 #strictFillStrategy
  2. update之前手动set updateTime 为null 或者 你想要的值

Comment From: ldw4033

public void updateFill(MetaObject metaObject) {
        UserInfoDetails user = SecurityUtils.getUser();
        if (user != null && metaObject.hasSetter("updateBy")) {
            if (null != this.getFieldValByName("updateBy", metaObject)) {
                this.setFieldValByName("updateBy", user.getUserId(), metaObject);
            } else {
                this.strictInsertFill(metaObject, "updateBy", String.class, user.getUserId());
            }
        }

        if (metaObject.hasSetter("updateTime")) {
            if (null != this.getFieldValByName("updateTime", metaObject)) {
                this.setFieldValByName("updateTime", new Date(), metaObject);
            } else {
                this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
            }
        }

    }

Comment From: SQNDNT

这个问题这么久没解决么,官网推荐的还不如this.setFieldValByName("updateTime", new Date(), metaObject);好用