美文网首页程序员
Spring MVC异常统一处理

Spring MVC异常统一处理

作者: GeorgeMR | 来源:发表于2018-06-06 11:45 被阅读0次

一个Java web应用会出现一些莫名的运行时异常,可能是用户的操作不当,也有可能是程序本身的bug。所以一个程序中就会出现很多需要处理的异常,如果每个异常都需要捕获处理,或者直接抛出,都是不明智的处理方式。如果能够统一处理一些不能直接向用户抛出的异常,或者没有发现的异常,有选择性的抛出用户的操作异常,包装系统内部问题,降低糟糕的用户体验。

  1. 使用 @ExceptionHandler 注解

    @ExceptionHandler注解的方法为处理异常的方法,须定义在需要处理异常的Controller

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface ExceptionHandler {
    
       /**
        * 通过注解的方法处理异常,如果value的值为空,将会监听所有类型的异常
        * 数组类型,可以指定多种类型的异常
        */
       Class<? extends Throwable>[] value() default {};
    
    }
    

    注解的作用对象为方法,并且运行时有效。该注解注释的方法可以具有灵活的输入参数:

    • 异常参数
    • 请求或响应对象:如ServletRequest/HttpServletRequest或PortleRequest/ActionRequest/RenderRequest
    • Session对象:HttpSession或PortletSession
    • WebRequest或NativeWebRequest
    • Locale
    • InputStream/Reader
    • OutputStream/Writer
    • Model

    方法返回值可以为:

    • ModelAndView对象
    • Model对象
    • Map对象
    • View对象
    • String对象
    • 还有@ResponseBody、HttpEntity<?>或ResponseEntity<?>,以及void
  2. 使用 @ControllerAdvice 注解,定义统一处理异常的类

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Component
    public @interface ControllerAdvice {
       @AliasFor("basePackages")
       String[] value() default {};
       @AliasFor("value")
       String[] basePackages() default {};
       Class<?>[] basePackageClasses() default {};
       Class<?>[] assignableTypes() default {};
       Class<? extends Annotation>[] annotations() default {};
    
    }
    

    注解作用对象为类、接口或枚举,在运行时有效,可以通过Spring扫描为bean组件。

    注解可以捕捉到全局的异常,然后交由@ExceptionHandler注解的方法类处理异常

通过@ControllerAdvice + @ExceptionHandler 的方式即可实现统一处理异常的效果

@ControllerAdvice
public class ExceptionHandler {
    @ResponseBody
    @org.springframework.web.bind.annotation.ExceptionHandler
    public String resolveException(HttpServletRequest request,
                                   HttpServletResponse response, Object handler, Exception ex) {

        //异常处理...       
    }
 }

相关文章

网友评论

    本文标题:Spring MVC异常统一处理

    本文链接:https://www.haomeiwen.com/subject/dskbsftx.html