博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
@ControllerAdvice+@ExceptionHandler处理架构异常捕获
阅读量:7226 次
发布时间:2019-06-29

本文共 2478 字,大约阅读时间需要 8 分钟。

1.注解引入

1) @ControllerAdvice - 控制器增强

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface ControllerAdvice {    @AliasFor("basePackages")    String[] value() default {};    @AliasFor("value")    String[] basePackages() default {};    Class
[] basePackageClasses() default {}; Class
[] assignableTypes() default {}; Class
[] annotations() default {};}
  1. @ControllerAdvice作为一个@Component,用以定义 @ExceptionHandler/@InitBinder/@ModelAttribute 修饰的方法 , 适用于所有使用 @RequestMapping的方法.
  2. Spring4之前,@ControllerAdvice 在同一调度的Servlet中协助所有控制器.Spring4之后,@ControllerAdvice支持配置控制器的子集,且默认的行为仍可用
  3. Spring4之后,@ControllerAdvice通过annotations()/basePackageClasses()/basePackages()方法定制用于选择控制器子集.

2) @ExceptionHandler - 异常处理器

@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface ExceptionHandler {    Class
[] value() default {};}

单独用@ExceptionHandler,限定当前Controller处理异常.配合@ControllerAdvice则摆脱此限制.

2.使用实例

@ControllerAdvicepublic class MultipartExceptionControllerAdvice {    private static final Logger log = LoggerFactory.getLogger(MultipartExceptionControllerAdvice.class);    /**     * 捕获文件上传异常     * @param ex     * @return     */    @ResponseBody    @ExceptionHandler(value = MultipartException.class)    public FrontResult fileErrorHandler(MultipartException ex) {        FrontResult result = new FrontResult();        result.setHasLive(0);        result.setCode(500);        result.setMsg("FAIL.");        log.error("file upload error : " , ex);        return result;    }}

3.处理Exception在捕获@ResponseStatus修饰的自定义异常时操作

import org.springframework.core.annotation.AnnotationUtils;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.ResponseStatus;import javax.servlet.http.HttpServletRequest;@ControllerAdvicepublic class ExceptionAdvice {    @ExceptionHandler(Exception.class)    @ResponseBody    public String handlerException(HttpServletRequest request , Exception e) throws Exception {                e.printStackTrace();        if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null) {            throw e;        }                return e.getMessage();    }}

 ::::  如果碰到了某个自定义异常加上了@ResponseStatus,就继续抛出,这样就不会让自定义异常失去加上@ResponseStatus的初衷。

转载于:https://www.cnblogs.com/nyatom/p/10219988.html

你可能感兴趣的文章
iframe 跨域高度自适应
查看>>
struts2+hibernate3+spring3(ssh2)框架下的web应用
查看>>
Linux下的三个时间属性
查看>>
semanage
查看>>
[case分享]Exchange 2010 登陆OWA查看邮件出现Rights managem operation failed
查看>>
linux dd 读取 写入磁盘速度
查看>>
dmidecode查看linux硬件信息
查看>>
linux监控对象及重要性
查看>>
walle-web自动化部署配置
查看>>
opencv轮廓提取、轮廓识别相关要点
查看>>
BOOST.ASIO源码剖析(一)
查看>>
过滤squidlog中各个链接的大小
查看>>
我的友情链接
查看>>
使用AnyChat如何实现任意两用户之间的音视频交互
查看>>
【个人小结】项目公共js的配置,解决不同页面多个配置修改的问题
查看>>
XAMP安装Apacher无法启动
查看>>
mongodb user
查看>>
ip地址子网划分
查看>>
Linux下快速搭建ntp时间同步服务器
查看>>
TouchEvent的传递过程学习笔记
查看>>