做ep登录的长时间未登录禁止功能,运维提供的开发环境和生产环境 schema名称不一样,需要基于mybatis-plus动态修改@TableName的schema属性。
1、动态表
package com.xxx.eplogin.pojo.model;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.Map;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
import org.springframework.stereotype.Component;
/**
* description:DynamicTable
*
* @author: lgq
* @create: 2024-06-04 15:24
*/
@Component
@Slf4j
public class DynamicTable implements InstantiationAwareBeanPostProcessor {
@Value("${spring.profiles.active}")
public String environment;
public static final String schema_uat = "schema_uat";
public static final String schema_prod = "schema_prod";
//只初始化一次
private static boolean isOk = false;
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
if (!isOk){
// 后续可以通过注解进行注册放入集合中
set(DemoA.class);
set(DemoB.class);
isOk = true;
}
return null;
}
private void set(Class<?>... classs){
for (Class<?> aClass : classs) {
TableName table = aClass.getAnnotation(TableName.class);
//获取代理处理器
InvocationHandler invocationHandler = Proxy.getInvocationHandler(table);
Field values;
try {
// 过去私有 memberValues 属性
values = invocationHandler.getClass().getDeclaredField("memberValues");
values.setAccessible(true);
// 获取实例的属性map
Map<String, Object> memberValues =(Map<String, Object>) values.get(invocationHandler);
// 修改属性值
String schema = "prod".equals(environment) ? schema_prod: schema_uat;
memberValues.put("schema", schema);
log.info(String.format("当前环境为: %s,设置 %s 的schema为:%s ", environment, aClass.getSimpleName(), schema));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
2、实体类
package com.xxx.eplogin.pojo.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* description:demoA
*
* @author: lgq
* @create: 2023-09-19 18:54
*/
@Data
@TableName(value = "demoa")
public class DemoA {
/**
* 用户标识
*/
@TableField("a")
private String a;
/**
* 用户名称
*/
@TableField("b")
private String b;
/**
* 参考用户,该字段用不到
*/
@TableField("c")
private String c;
/**
* 用户别名
*/
@TableField("d")
private String d;
}