依照课件,我们已经完成了对商品的CRUD已经分页,条件等基本功能,正如课件和视频中所说,我们需要对controller有一个统一的异常处理。
创建com.changgou.framework.exception.BaseExceptionHandler,代码如下:
@ControllerAdvice
public class BaseExceptionHandler {
/***
* 异常处理
* @param e
* @return
*/
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result error(Exception e) {
e.printStackTrace();
return new Result(false, StatusCode.ERROR, e.getMessage());
}
}
其实这段代码的原理只要认真学过springAOP的同学就能轻易理解,而这也正是springAOP的典型应用场景之一,基于AOP,我们也可以自己动手实现一个简易版的统一异常处理。
创建com.changgou.framework.exception.EasyExceptionHandler
首先在类上添加@Aspect和@Component注解,使它成为一个切面类并加入spring容器,然后定义切入点,切入点为所有添加了RequestMapping注解的方法,然后再编写后置异常通知方法,具体代码如下:
@Aspect
@Component
public class EasyExceptionHandler {
/**
* 定义切入点
*/
@Pointcut("@within(org.springframework.web.bind.annotation.RequestMapping)")
public void exceptionHandler(){}
/**
* 后置异常通知
* 定义一个名字,该名字用于匹配通知实现方法的一个参数名,当目标方法抛出异常返回后,将把目标方法抛出的异常传给通知方法;
* throwing:限定了只有目标方法抛出的异常与通知方法相应参数异常类型时才能执行后置异常通知,否则不执行,
* 对于throwing对应的通知方法参数为Throwable类型将匹配任何异常。
* @param joinPoint
* @param exception
*/
@AfterThrowing(value = "exceptionHandler()",throwing = "exception")
public void doAfterThrowingAdvice(JoinPoint joinPoint, Throwable exception){
//目标方法名:
System.out.println(joinPoint.getSignature().getName());
System.out.println("发生了异常:" + exception);
}
}
我们再启动eureka和goods,在代码中我们故意写一个错误用来测试,发送请求后可以看到,我们的EasyExceptionHandler 生效了:
不过这只是用来理解一下AOP的小例子,达到目的玩一下我们就可以删了,没必要重复造轮子。
最后,视频中还给我们留下了一个任务,那就是抽取到common模块,这个任务很简单,直接在common下创建一个exception包,把BaseExceptionHandler 复制粘贴到exception包下,需要注意的是,我们在goods模块的启动类下将它注入到spring容器:
@Bean
public BaseExceptionHandler baseExceptionHandler(){
return new BaseExceptionHandler();
}