springBoot 2.x.x MetaObjectHandler自动填充不生效
·
MetaObjectHandler自动填充不生效 踩空日记
企鹅群 398913416
版本
spring.boot 2.2.0
mybatis-plus 3.5.3.1
配置文件
spring:
mybatis-plus:
configuration:
meta-object-handler: true
MetaObjectHandler.java
package com.ruoyi.sky.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.sky.context.BaseContext;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Slf4j
@Component
// 要让 每次新增、更新时自动设置用户信息和时间戳。
public class AutoMyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
try {
// 自动填充创建时间
// this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class);
// 自动填充更新时间
this.strictInsertFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
// 当前用户登录
Long currentUserId = BaseContext.getCurrentId();
String currentUserName = BaseContext.getCurrentUserName();
// log.info("userIdAAAA:{}", currentUserId);
// log.info("currentUserIdaaaaa:{}", currentUserName);
if (currentUserId != null) {
this.strictInsertFill(metaObject, "userId", () -> currentUserId, Long.class);
}
if (currentUserName != null) {
this.strictInsertFill(metaObject, "updateUser", () -> currentUserName, String.class);
}
} catch (Exception e) {
throw e;
}
}
@Override
public void updateFill(MetaObject metaObject) {
try {
log.info("开始更新填充...");
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
Long currentUserId = BaseContext.getCurrentId();
String currentUserName = BaseContext.getCurrentUserName();
log.info("userId:{}", currentUserId);
log.info("currentUserId:{}", currentUserName);
if (currentUserId != null) {
this.strictUpdateFill(metaObject, "userId", () -> currentUserId, Long.class);
}
if (currentUserName != null) {
this.strictUpdateFill(metaObject, "updateUser", () -> currentUserName, String.class);
}
} catch (Exception e) {
throw e;
}
}
}
BaseContext.java
这个文件在全局拦截中做处理 通过前端的请求头里面去解析token信息 然后去redis 的key的匹配前端的token 在通过redis去解析 拿到 当前登录用户信息
package com.sky.context;
public class BaseContext {
// 保存每个请求独立的用户 ID
private static final ThreadLocal<Long> THREAD_LOCAL_ID = new ThreadLocal<>();
// 保存每个请求独立的用户名
private static final ThreadLocal<String> THREAD_LOCAL_USERNAME = new ThreadLocal<>();
/**
* 获取当前用户 ID
*/
public static Long getCurrentId() {
return THREAD_LOCAL_ID.get();
}
/**
* 设置当前用户 ID
*/
public static void setCurrentId(Long id) {
THREAD_LOCAL_ID.set(id);
}
/**
* 获取当前用户名
*/
public static String getCurrentUserName() {
return THREAD_LOCAL_USERNAME.get();
}
/**
* 设置当前用户名
*/
public static void setCurrentUserName(String username) {
THREAD_LOCAL_USERNAME.set(username);
}
/**
* 清理 ThreadLocal(在拦截器 afterCompletion 中调用)
*/
public static void remove() {
THREAD_LOCAL_ID.remove();
THREAD_LOCAL_USERNAME.remove();
}
}
更多推荐


所有评论(0)