当前使用版本(必填,否则不予处理)
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
- 重写 #strictFillStrategy
- 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);好用