我们知道处理controller中的异常可以在controller类中写方法加上@ExceptionHandler来处理,这样只能处理一个controller中的异常,进一步,我们可以编写一个controller的切面来增强controller中的方法来处理异常,springmvc给我们提供了一个注解简化了我们手动注册aop的过程,这个注解就是@ControllerAdvice,只要写一个类加上@ControllerAdvice,并在这个类中写方法,在方法上加上@ExceptionHandler就可以处理所有controller中的异常了。我这里只是对处理controller中异常做了简单描述,我默认你们都懂这个方法,就没有详细贴代码了。
今天我们主要想解决的是spring处理所有的异常,不仅仅是在controller中的异常。我们知道springmvc的核心就是DispactherServlet,这个类会根据请求路径找处理器映射器来寻找controller方法处理请求,在controller中我们会调用service,service调用dao。前面我们说的方法只能处理在controller方法中抛出的异常。但是往往天不如人意,我们在service和dao中可能会抛出非检查型异常,这样上述的哪种方法就不能帮我们处理异常了。但是现实环境中我门通常也需要处理这部分异常。这就需要我们今天的主角 HandlerExceptionResolver 。我们可以注意到,如果我们程序内发生了非检查型异常,通常spring会帮我们返回一个500响应。这就说明spring帮我们做了一个简单的异常处理。我们需要做的就是增强或者替换这个异常处理逻辑。
很简单就能想到,按照spring的风格,如果我们想覆盖或增强spring默认处理的东西,只需要在spring容器中注入某个类的实现就行。所以我们需要在spring容器中注入一个HandlerExceptionResolver的实现,这样我们就能处理所有的异常了这里贴上我的代码
@Component
public class SimpleHand