一、开门见山

  在前后端分离框架的大趋势下,前后端基本的职责已经确定。

  前端主要负责界面的处理以及基本的判空检验。数据来源则通过vue调用后端发布的接口。

  后端的原型还是mvc的模式:

controller

接受前端请求(entity或者list<entity>),并调用service提供的功能性接口,返回json

service 定义接口做实际的业务处理,数据库处理。可以调用微服务接口,可以调用dao层的数据库CURD
dao 一般单表操作,利用mybatisplus就可以实现单笔或者批量操作

  

  从表格中我们可以看出,service层主要处理业务逻辑,那么就一定会有意想不到的“惊喜”,因此我们一般需要在service层

进行异常处理,并将此异常抛给controller进行处理(因为controller是前后端沟通的桥梁,可以将异常处理后,返回给前端),

就此ControllerAdvice闪亮登场!

二、异常处理流程详解

2.1、定义错误码

  路径:i18n/message_zh_CN.properties(国际化文本,此处不做赘述,不懂得尽快去找度娘)

00=操作成功
01=数据库插入数据失败
02=数据库删除数据失败
03=数据库更新数据失败
04=数据库查询数据失败
05=查询结果为空
06=工作流操作失败
07=请求参数异常
08=操作异常

2.2、定义获取中文描述的工具类

@Component
public class MessageUtil {    private static MessageSource messageSource; @Autowired
public MessageUtil(MessageSource messageSource) {
messageSource = messageSource;
} public static String get(String msgKey) {
try {
String message = messageSource.getMessage(msgKey, (Object[])null, LocaleContextHolder.getLocale());
       return message;
} catch (Exception var2) {
return msgKey;
}
}
}

2.3、定义枚举类进行包装

public enum SCodeEnum {
SUCCESS("00"),
INSERT_ERROR ("01"),
DELETE_ERROR("02"),
UPDATE_ERROR("03"),
SELECT_ERROR("04"),
SELECT_EMPTY("05"),
OPERATE_FLOWABLE_ERROR("06"),
REQUEST_ARGS_ERROR("07"),
OPERATE_EXCEPTION("08");
private String code;
SCodeEnum(String code) {
this.code=code;
}
public String getCode(){
return this.code;
}
}

2.4、错误码与错误信息的获取

//获取错误码
SCodeEnum.SUCCESS //获取错误信息
MessageUtil.get(SCodeEnum.SUCCESS.getCode())

2.5、定义自己的异常处理类(统一抛出此异常)

public class BizException extends Exception {

    public BizException(SCodeEnum codeEum) {
super(MessageUtil.get(codeEum.getCode()));
super.errorCode = codeEum.getCode();
}
}

2.6、定义全局异常处理类,加上ControllerAdvice

@RestControllerAdvice()   //当返回是json的时候,利用RestControllerAdvice,类比RestController
public class SiteExceptionHandler { //自定义异常
@ExceptionHandler(BizException.class)
public Object handleException(HttpServletRequest request, BizException e){
LoggerUtil.error("出现异常======> [{}] ",e);
return SResponseUtil.output(SCodeEnum.OPERATE_EXCEPTION,
MessageUtil.get(SCodeEnum.OPERATE_EXCEPTION.getCode()));
} //spring @Valid判空拦截的异常
@ExceptionHandler(MethodArgumentNotValidException.class)
public Object handleException(HttpServletRequest request, MethodArgumentNotValidException e){
LoggerUtil.error("出现异常======> [{}] ",e);
String message = e.getBindingResult().getAllErrors().stream().findFirst().get().getDefaultMessage();
return SResponseUtil.output(SCodeEnum.REQUEST_ARGS_ERROR, message);
} //当抛出没有拦截的异常的时,就会统一由最高级Exception接管
@ExceptionHandler(Exception.class)
public Object handleException(HttpServletRequest request, Exception e){
LoggerUtil.error("出现异常======> [{}] ",e);
return SResponseUtil.output(SCodeEnum.OPERATE_EXCEPTION,
MessageUtil.get(SCodeEnum.OPERATE_EXCEPTION.getCode()));
}
}

2.7、service层开始抛异常

throw new BizException(codeEum);

三、每日闲暇时光

3.1、新鲜事

  高考结束

3.2、歌曲推荐

  北京东路的日子,祝愿考生们即将开始新的旅程。

3.3、影视推荐

  超时空接触,如果你也是一名喜欢科幻,热爱探索未知的童鞋。

3.4、每日金句

  高考,是人生中唯一一次拿起武器为自己战斗的时刻,或许不能决定你的一生,但可以给你一种权利,选择的权力。-魏平涛

3.5、养眼壁纸

  妹子虽好看,没有营养快线,切莫贪杯哦

最新文章

  1. STM8 EEPROM:
  2. Lua修改文件名
  3. sublime text多文件夹查找关键字
  4. logback详细配置(三)
  5. c# this.location和e.X的区别
  6. 关于Servlet会话跟踪的那些事儿
  7. 存储过程 分页【NOT IN】和【&gt;】效率大PK 千万级别数据测试结果
  8. HW4.8
  9. 杂文:AlphaGo 与 Alan Turing
  10. Bootstrap风格登录界面设计样例
  11. maven 打包源文件
  12. oracle 通过查询灵活插入数据 insert into ...select..
  13. 关于数据汇总方面返回Json数据的小小心得
  14. [转]hibernate三种状态详解
  15. 单选按钮(RadioButton)与复选框(CheckBox)的功能与用法
  16. 【Spring】关于SpringMvc监听的知识点
  17. mysql 打开慢查询日志
  18. 面试中的Https
  19. [模板] 2-SAT 问题
  20. 国际快递查询接口JAVA示例-trackingmore

热门文章

  1. Autoware 标定工具 Calibration Tool Kit 联合标定 Robosense-16 和 ZED 相机!
  2. Apache(httpd)详解
  3. nodejs如何从异步回调函数返回想要的值
  4. tomcat的安装部署(windows10)
  5. 动作函数-web_custom_request
  6. java中int和Integer的区别?为什么有了int还要有设计Integer?
  7. ABP (.Net Core 3.1版本) 使用MySQL数据库迁移启动模板项目(1)
  8. Java基础-Java中transient有什么用-序列化有那几种方式
  9. Flink 集群搭建,Standalone,集群部署,HA高可用部署
  10. Linux系统结构详解(转)