1.通过try{ } catch{ }捕获异常处理
2.SpringMVC的全局异常处理器
第一种方式(不常用)
@DeleteMapping(value = "/baseTrademark/remove/{id}")
public Result delBaseTrademark(@PathVariable Long id) {
try {
baseTrademarkService.delBaseTrademark(id);
return Result.ok();
} catch (GmallException e) {
ResultCodeEnum resultCodeEnum = e.getResultCodeEnum();
return Result.build(null,resultCodeEnum);
}
}
第二种方式:
配置一个全局处理异常的类
@RestControllerAdvice //代表这个类是全局异常处理器 @ControllerAdvice + @ResponseBody
public class GlobalExceptionHandler {
@ExceptionHandler(value = GmallException.class)
public Result gmallGlobalExceptionHandler(GmallException e){
e.printStackTrace();
return Result.build(null,e.getResultCodeEnum());
}
@ExceptionHandler(value = Exception.class)
public Result systemExceptionHandler(Exception e){
e.printStackTrace();
return Result.build(null, ResultCodeEnum.SYSTEM_ERROR);
}
}
注意:如果这个类放置的位置不符合启动类的包扫描规则,需要加上@ComponentScan注解,但是这个注解一旦显式的使用,会破坏掉spring boot默认的包扫描规则,所以需要报这个包写大,或使用@Import注解替代
方式二升级:自定义注解
自定义一个注解直接加载启动类上
@Retention(value = RetentionPolicy.RUNTIME)//通过jdk元注解设置注解的存活时期为运行时期
@Target(value = ElementType.TYPE) //通过jdk元注解设置注解的使用位置在类上
@Import(value = GlobalExceptionHandler.class) //@Import作用:把一个类导入到spring容器中,如果被导入的类是一个配置类,那么在该配置中所定义的bean同样会被导入到spring容器中
public @interface EnableGlobalExceptionHandler {
}
方式二在升级:spring boot自动化配置
spring boot自动化配置原理:在项目启动的时候class path路径下META-INFO文件夹中的spring.factories中的内容会被自动读取,读取的是一个个键值对,该建所对应的值就是配置类的全类名,然后通过导入器(ImportSelector)将这个类导入到spring容器中,在该类中所配置的那些类也被导入到了spring容器中,并配合条件注解来决定当前这个配置是否生效.