@ControllerAdvice,是spring3.2提供的新注解,从名字上可以看出大体意思是控制器增强。
注解@ControllerAdvice的代码:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)  //规定注解时长
@Documented
@Component
public @interface ControllerAdvice {  }  

该注解使用了@Component注解,这样的话当我们使用<context:component-scan>扫描时也能扫描到。

其javadoc定义:

/**
* Indicates the annotated class assists a "Controller".
*
* <p>Serves as a specialization of {@link Component @Component}, allowing for
* implementation classes to be autodetected through classpath scanning.
*
* <p>It is typically used to define {@link ExceptionHandler @ExceptionHandler},
* {@link InitBinder @InitBinder}, and {@link ModelAttribute @ModelAttribute}
* methods that apply to all {@link RequestMapping @RequestMapping} methods.
*
* @author Rossen Stoyanchev
* @since 3.2
*/

即把@ControllerAdvice注解内部使用@ExceptionHandler、@InitBinder、@ModelAttribute注解的方法应用到所有的 @RequestMapping注解的方法。非常简单,不过只有当使用@ExceptionHandler最有用,另外两个用处不大。
如下面代码中的processUnauthenticatedException方法就会应用到有@RequestMapping注解的方法。

代码:

@ControllerAdvice
public class ControllerAdviceTest {  @ModelAttribute  public User newUser() {  System.out.println("============应用到所有@RequestMapping注解方法,在其执行之前把返回值放入Model");  return new User();  }  @InitBinder  public void initBinder(WebDataBinder binder) {  System.out.println("============应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器");  }  @ExceptionHandler(UnauthenticatedException.class)  @ResponseStatus(HttpStatus.UNAUTHORIZED)  public String processUnauthenticatedException(NativeWebRequest request, UnauthenticatedException e) {  System.out.println("===========应用到所有@RequestMapping注解的方法,在其抛出UnauthenticatedException异常时执行");  return "viewName"; //返回一个逻辑视图名  }
}  

如果你的spring-mvc配置文件使用如下方式扫描bean
Java代码 收藏代码

<context:component-scan base-package="com.sishuok.es" use-default-filters="false">  <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>  

需要把@ControllerAdvice包含进来,否则不起作用:
Java代码 收藏代码

<context:component-scan base-package="com.sishuok.es" use-default-filters="false">  <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>  <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>  

1、@ModelAttribute注解的方法作用跟springMVC中的作用是一样的,只不过此处是对所有的@RequestMapping注解的方法都起作用。当需要设置全局数据时比较有用。

2、@InitBinder注解的方法作用同1类似。当需要全局注册时比较有用。

3、@ExceptionHandler,异常处理器,此注解的作用是当出现其定义的异常时进行处理的方法,其可以使用springmvc提供的数据绑定,比如注入HttpServletRequest等,还可以接受一个当前抛出的Throwable对象。

该注解非常简单,大多数时候其实只@ExceptionHandler比较有用,其他两个用到的场景非常少,这样可以把异常处理器应用到所有控制器,而不是@Controller注解的单个控制器。

来源:http://jinnianshilongnian.iteye.com/blog/1866350

我在实际项目中遇到的:


@ControllerAdvice  //增强注解
@ResponseBody
public class ExceptionAdvice {/** * 400 - Bad Request */  @ResponseStatus(HttpStatus.BAD_REQUEST)  @ExceptionHandler(HttpMessageNotReadableException.class)  public BaseResult handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
//        logger.error("参数解析失败", e);  return new BaseResult().failure("could_not_read_json");  }  /** * 405 - Method Not Allowed */  @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)  @ExceptionHandler(HttpRequestMethodNotSupportedException.class)  public BaseResult handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) {
//        logger.error("不支持当前请求方法", e);  return new BaseResult().failure("request_method_not_supported");  }  /** * 415 - Unsupported Media Type */  @ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE)  @ExceptionHandler(HttpMediaTypeNotSupportedException.class)  public BaseResult handleHttpMediaTypeNotSupportedException(Exception e) {
//        logger.error("不支持当前媒体类型", e);  return new BaseResult().failure("content_type_not_supported");  }  /** * 500 - Internal Server Error */  @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)  @ExceptionHandler(Exception.class)  public BaseResult handleException(Exception e) {
//        logger.error("服务运行异常", e);  return new BaseResult().failure(e.getLocalizedMessage());  }
}

上面使用了@ControllerAdvice注解的类里的方法,会在控制器代码里出现相应错误时调用,然后返回一个结果到前端。

Spring3.2新注解@ControllerAdvice相关推荐

  1. 【Spring】新注解

    新注解 注解 释意 @Configuration 作用:指定当前类是一个配置类 细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写 ...

  2. SpringMVC:注解@ControllerAdvice的工作原理

    点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 来源:blog.csdn.net/andy_zhang200 ...

  3. Spring的新注解——Configuration、ComponentScan、Bean、Import、PropertySource || spring整合Junit分析

    spring中的新注解 spring整合Junit分析 1.应用程序的入口       main方法 2.junit单元测试中,没有main方法也能执行     junit集成了一个main方法    ...

  4. Spring-学习笔记06【Spring的新注解】

    Java后端 学习路线 笔记汇总表[黑马程序员] Spring-学习笔记01[Spring框架简介][day01] Spring-学习笔记02[程序间耦合] Spring-学习笔记03[Spring的 ...

  5. JAVAEE框架之Spring新注解

    五.Spring5 新注解 ​ 新的注解有用,为后面的SpringBoot可以打一个基础,因为到SpringBoot的课程, 多了很多注解.这时候,先了解一部分. 5.1 @Configuration ...

  6. Spring原始注解和新注解(使用注解代替xml配置文件)

    Spring原始注解 spring的原始注解主要是为了替代xml文件中配置的 < bean > @Component:使用在类上用于实例化Bean @Controller:使用在web层类 ...

  7. Struts2.3.5+Hibernate3+Spring3.1基于注解实现的多文件上传,下载

    Struts2.3.5+Hibernate3+Spring3.1基于注解实现的的多文件上传,下载,这里是上传文件到数据库中,上传控件可以增加和删除,有需要的朋友可以看看. 以下是源码下载地址:http ...

  8. @select注解_SSM框架(十三):Spring框架中的IoC(3)新注解,完全摆脱xml文件

    spring中的新注解 1.Configuration 作用:指定当前类是一个配置类 细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以 ...

  9. Spring3.1新属性管理API:PropertySource、Environment、Profile

    2019独角兽企业重金招聘Python工程师标准>>> Spring3.1提供了新的属性管理API,而且功能非常强大且很完善,对于一些属性配置信息都应该使用新的API来管理.虽然现在 ...

最新文章

  1. oracle本身的常用数据字典表
  2. 将matlab的.m文件打包为独立可执行程序.exe —— 基于Matlab R2015b
  3. 自己发现的数学规律一
  4. android 系统状态栏的隐藏和显示
  5. apkTool反编译apk碰到的问题
  6. 【CSS基础】实现 div 里的内容垂直水平居中
  7. php中简单ubb案例,php Ubb代码编辑器函数代码
  8. 配置内网windows域教程,模拟公司内网架构
  9. mysqld: [ERROR] Found option without preceding group in config file my.ini at line 1
  10. 计算机xp怎样连接internet,XP系统电脑怎么连接无线WIFI网络,涨知识了
  11. WSL1安装rust报错thread ‘main‘ panicked的解决方法
  12. Python 实现生命游戏
  13. 全球重力异常值和磁场异常值提取
  14. 西安公交车路线汇总(1)
  15. 文本数据的词云可视化
  16. 电脑无线如何启用dhcp服务器,win7系统使用无线连接遇到DHCP未启用报错如何解决...
  17. 分布式专题(一)什么是分布式
  18. 量子力学奇妙之旅-从相对论下薛定谔方程到量子场论
  19. 当世事再没完美可远在岁月如歌中找你
  20. 模糊控制——隶属函数

热门文章

  1. optee3.14.0 qemu_v8的环境搭建篇
  2. android指纹fingerprint学习总结
  3. 《格理论与密码学》笔记一
  4. CreateThread和CreateRemoteThread
  5. 解决System.Web.Script.Serialization导入失败
  6. 1.6 @FunctionalInterface注解
  7. Codeforces Beta Round #6 (Div. 2)【未完结】
  8. 4.2.1 磁盘的结构
  9. 项目: 用Easyx绘制围棋和象棋的棋盘
  10. ActiveMQ目录结构