外卖开发(二)开发笔记
外卖开发(二)开发笔记
- 一、DTO
- 二、自定义全局异常处理
- 三、ThreadLocal存入、提取当前登陆用户的id
- 四、日期格式化
- 1、实体类属性上加入注解@JsonFormat
- 2、在WebMvcConfiguration中扩展SpringMVC的消息转换器
一、DTO
数据传输对象(DTO)(Data Transfer Object),用于前端与controller层之间的数据交互。一般,前段提交的数据和实体类中对应的属性差别比较大是时,用DTO来封装数据。
二、自定义全局异常处理
当注册账号时,如果账号已经存在,需要我们进行全局异常处理。
我们在数据库中定义了账号的唯一性,所以在添加新账号时会抛出异常:Error updating database,java.sql.SQLIntegrityconstraintViolationException: Duplicate entry 'zhangsan' for key 'employee.idx_usernane'
针对这个问题,我们可以通过全局异常处理:
GlobalExceptionHandler.java
@ExceptionHandler
//SQLIntegrityconstraintViolationException: Duplicate entry 'zhangsan' for key 'employee.idx_usernane'
public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){
//获取报错信息
String message = ex.getMessage();
//确定是因为账号已存在报的错误
if(message.contains("Duplicate entry")){
//将字符串通过空格分离,装入数组中,并提取第三个值,拿到前段输入的账号
String[] split = message.split(" ");
String username = split[2];
String mes = username + MessageConstant.ALREADY_EXISTS;
return Result.error(mes); //返回异常提示
}
else {
return Result.error(MessageConstant.UNKNOWN_ERROR);
}
}
三、ThreadLocal存入、提取当前登陆用户的id
当我们修改完之后,需要修改数据库中 update_user
字段,我们就需要获取当前用户的id。
员工登陆之后,如何获取id?ThreadLocal
工程中已经封装好了ThreadLocal操作的工具类。
既然每一次请求都会新建一个ThreadLocal,那么联想到,我们每次操作,都会被拦截器拦截,判断是否具有jwt令牌,以此做到登录校验,所以我们可以在拦截器中
解析出员工ID,并加入到ThreadLocal,这样后续的操作中就可以根据ThreadLocal提取到id。
JwtTokenAdminInterceptor.java
获取当前用户ID
四、日期格式化
1、实体类属性上加入注解@JsonFormat
2、在WebMvcConfiguration中扩展SpringMVC的消息转换器
统一对日期进行格式化管理。
WebMvcConfiguration.java
/**
* 扩展消息转换器:处理日期格式
* @param converters
*/
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
//创建一个消息转换器
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
//需要为消息转换器设置一个对象转换器,对象转换器可以讲java对象序列化为json
converter.setObjectMapper(new JacksonObjectMapper());
//将自己的消息转化器放入容器中,并提高优先级。
converters.add(0,converter);
}