0.首先了解一个注解@ControllerAdvice,他是spring里的一个注解,用于定义全局逻辑异常、数据绑定、请求处理等逻辑,与@ExceptionHandler等注解使用。

ControllerAdvice本质上就是一个Component,他用于对controller实现aop,

这里我们就是配合exceptionHandler捕获并抛出异常给前端

1.先定义一个我们自己的异常类,继承运行时异常

@NoArgsConstructor
@AllArgsConstructor
@Getter
public class MyException extends RuntimeException{
private String errMessage;
}

2.定义一个与前端约定好的异常类

@Data
@AllArgsConstructor
public class RestErrorResponse implements Serializable {
private String errMessage; }

3.通过controllerAdvice进行全局配置,这里我们是自己写的异常就正常抛出即可,其他异常直接统一抛出未知错误(比如经典的遇到了1/0)

@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
@ResponseBody
@ExceptionHandler(MyException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public RestErrorResponse customException(MyException myException){
log.error("系统异常{}",myException.getErrMessage(),myException);
// 解析异常
String errMessage = myException.getErrMessage();
return new RestErrorResponse(errMessage);
}
@ResponseBody
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public RestErrorResponse exception(Exception e){
log.error("系统异常{}",e.getMessage(),e);
return new RestErrorResponse(CommonError.UNKOWN_ERROR.getErrMessage());
}
}

拓展:关于扫描问题,这里我的配置是没有错的,但是一直不走这个路线,直接throw就没了。后面我发现其实是我的启动类放错了位置。

我的配置模块是位于xuecheng-plus-base/src/main/java/com/xuecheng/base/exception/GlobalExceptionHandler.java

而我的启动类是位于xuecheng-plus-content/xuecheng-plus-content-api/src/main/java/com/xuecheng/content/ContentApplication.java

很明显这时的启动类只能扫描到content及以内的,如果我需要扫描到配置,需要将启动类修改为

xuecheng-plus-content/xuecheng-plus-content-api/src/main/java/com/xuecheng/ContentApplication.java

或者在启动类中添加扫描

@SpringBootApplication(scanBasePackages = "com.xuecheng"

这里为什么不在一个模块内也会被扫描到?
其实关于学成在线这一块是比较绕的,我经过梳理发现:api模块是依赖model模块的,而model模块又依赖base模块。因此api模块也是依赖basebase模块。而大家的包都是com.xuecheng,因此可以被扫描到

如何为spring配置全局抛出异常注解的更多相关文章

  1. Spring 配置定时器(注解+xml)方式—整理

    一.注解方式 1. 在Spring的配置文件ApplicationContext.xml,首先添加命名空间 xmlns:task="http://www.springframework.or ...

  2. 脱离xml使用JavaConfig实现Spring配置

    总结 情况一: 配置类中类名添加 @Configuration 注解,同时提供一个方法返回一个Bean实例,且这个方法添加注解 @Bean ,就可以由Spring管理此对象 如下所示: User.ja ...

  3. spring,mybatis事务管理配置与@Transactional注解使用[转]

    spring,mybatis事务管理配置与@Transactional注解使用[转] spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是至关 ...

  4. Spring IOC之基于注解的容器配置

    Spring配置中注解比XML更好吗?基于注解的配置的介绍提出的问题是否这种途径比XML更好.简单来说就是视情况而定. 长一点的答案是每一种方法都有自己的长处也不足,而且这个通常取决于开发者决定哪一种 ...

  5. Spring框架学习之注解配置与AOP思想

         上篇我们介绍了Spring中有关高级依赖关系配置的内容,也可以调用任意方法的返回值作为属性注入的值,它解决了Spring配置文件的动态性不足的缺点.而本篇,我们将介绍Spring的又一大核心 ...

  6. spring配置redis注解缓存

    前几天在spring整合Redis的时候使用了手动的方式,也就是可以手动的向redis添加缓存与清除缓存,参考:http://www.cnblogs.com/qlqwjy/p/8562703.html ...

  7. Spring Boot 全局异常配置

    Spring Boot 全局异常配置,处理异常控制器需要和发生异常的方法在一个类中.使用 ControllerAdvice 注解 package com.li.controller; import o ...

  8. spring,mybatis事务管理配置与@Transactional注解使用

    spring,mybatis事务管理配置与@Transactional注解使用[转]   spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是 ...

  9. Spring 和 SpringMVC 常用注解和配置(@Autowired、@Resource、@Component、@Repository、@Service、@Controller的区别)

    Spring 常用注解 总结内容 一.Spring部分 1.声明bean的注解 2.注入bean的注解 3.java配置类相关注解 4.切面(AOP)相关注解 5.事务注解 6.@Bean的属性支持 ...

  10. spring的配置模式与注解模式基础

    “依赖注入”是spring的核心特征,在Web服务器(如Tomcat)加载时,它会根据Spring的配置文件中配置的bean或者是通过注解模式而扫描并装载的bean实例自动注入到Application ...

随机推荐

  1. vue侦听器 - watch

    使用watch来侦听data中数据的变化,watch中的属性一定是data 中已经存在的数据. 当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,只有data中的数据才能够 ...

  2. LeetCode 332. Reconstruct Itinerary重新安排行程 (C++/Java)

    题目: Given a list of airline tickets represented by pairs of departure and arrival airports [from, to ...

  3. Linux扩展篇-shell编程(五)-流程控制(一)-if语句

    基本语法: (1)单分支 if [ condition ];then statement(s) fi 或 if [ condition ] then statement(s) fi (2)多分支 if ...

  4. ZeroPadding 参照

    加密时要处理. 解密时,不需要额外处理,直接NoPadding. import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; impor ...

  5. (一)requests-实战小练习

    1.需求:爬取豆瓣电影分类排行榜 https://movie.douban.com/中的电影详情数据 (此处以抓取科幻电影分类的信息为例) import requests import json ur ...

  6. nginx location实战

    nginx location高级实战 location是nginx的核心重要功能,可以设置网站的访问路径,一个web server会有多个路径,那么location就得设置多个. Nginx的loca ...

  7. rust 程序设计笔记(2)所有权 & 引用

    所有权 数据存储在栈和堆上,存放在栈上的数据都是已知所占据空间的 突然的问题 // 内存中的栈是怎么存储数据的? 好的,想象一下你有一摞盘子.你只能从上面放盘子,也只能从上面拿盘子,这就是栈的工作方式 ...

  8. Libgdx游戏开发(4)——显示中文文字

    原文: Libgdx游戏开发(4)--显示中文文字-Stars-One的杂货小窝 本文代码示例采用kotlin代码进行讲解,且需要有libgdx入门基础 这里主要介绍关于在Libgdx显示文字的2种方 ...

  9. 使用python+pytesseract实现图片中文字的识别

    一.安装tesseract 1.下载链接 https://digi.bib.uni-mannheim.de/tesseract/ 2.网盘下载地址 链接:https://pan.baidu.com/s ...

  10. 在WPF UWP WinUI中相同功能的用法的区别

    文件选择器 WPF:OpenFileDialog Microsoft.Win32.OpenFileDialog openFileDialog = new(); bool? result = openF ...