瑞吉外卖 day3

这篇博客介绍了在Java开发中如何使用@TableField注解和MetaObjectHandler处理实体类的公共字段,如创建时间和修改时间等。通过ThreadLocal解决在不同线程间共享数据的问题,确保每个线程有自己的变量副本。同时,文章提到了自定义异常CustomException的使用,以及如何通过全局异常捕获器处理这类异常,确保系统稳定性和用户体验。
摘要由CSDN通过智能技术生成

公共字段填充

在开发阶段发现多张表有相同的字段 例如创建时间 修改时间 这些大多属于公共字段

对于公共字段的统一处理用来简化开发

代码实现

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());

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值