公共字段填充
在开发阶段发现多张表有相同的字段 例如创建时间 修改时间 这些大多属于公共字段
对于公共字段的统一处理用来简化开发
代码实现
1.在实体类属性上添加
@TableField 注解指定自动填充的策略
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
//更新时间
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
//创建人
@TableField(fill = FieldFill.INSERT)
private Long createUser;
//修改人
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser
2.按照要求编写元数据对象处理器 在此类中统一为公共字段赋值 此类需要实现MetaObjectHandler 接口
@Component
@Slf4j
public class MyMetaObjecthandler implements MetaObjectHandler {
/**
* 插入操作
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
log.info("公共字段填充。。。。");
log.info(metaObject.toString());
metaObject.setValue("createTime",LocalDateTime.now());
metaObject.setValue("updateTime",LocalDateTime.now());
metaObject.setValue("createUser",BaseContext.getCurrentId());
metaObject.setValue("updateUser",BaseContext.getCurrentId());
}
/**
* 更新操作
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
log.info("公共字段填充。。。。更新");
log.info(metaObject.toString());
metaObject.setValue("updateTime",LocalDateTime.now());
metaObject.setValue("updateUser",BaseContext.getCurrentId());
}
}
在解决公共字段问题上发现在自定义的元数据对象处理器中发现我们之前将id设入HttpSession中 但是在我们自定义的 MyMetaObjecthandler implements MetaObjectHandler 类中无法获取HttoSession的
所以我们使用ThreadLocal本地线程变量
注意:就是客户端发送的每次http请求,对应的在服务端都会分配一个新的线程来处理 已下涉及到的类中的方法都属于一个线程
1、LoginCheckFilter的doFilter方法
2、EmployeeContraller的update方法
3、MyMetaObjectHandler的updateFill方法
Long empId = (Long)request.getSession().getAttribute("employee");
BaseContext.setCurrentId(empId);
在doFilter方法中将id设入线程
在设置公共字段时使用
long id = Thread.currentThread().getId() ;
将id取出来在设置公共字段
什么是ThreadLocal?
ThreadLocal并不是一个Thread,而是Thread的局部变量。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。
ThreadLocal常用方法:
- public void set(T value) 设置当前线程局部变量的值
- public T get() 返回当前线程所对应的线程局部变量的值
新建一个自定义异常
public class CustomException extends RuntimeException{
public CustomException(String message){
super(message);
}
}
继承运行异常类 在删除分类时 发现错误抛出自定义异常
if (count1 > 0){
//已经关联菜品
throw new CustomException("当前分类下关联了菜品不能删除!");
}
并通过抛出一个自定义的异常 并通过构造器设置其异常信息
再通过之前建立的全局异常捕获器捕获自定义异常并抛出错误信息给前端
@ExceptionHandler(CustomException.class)
public R<String> exceptionHandler(CustomException ex){
log.info(ex.getMessage());
return R.error(ex.getMessage());
}