Spring3.2新注解@ControllerAdvice

Spring3.2新注解@ControllerAdvice

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

Java代码  

  1. @Target(ElementType.TYPE)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Component
  5. public @interface ControllerAdvice {
  6. }

没什么特别之处,该注解使用@Component注解,这样的话当我们使用<context:component-scan>扫描时也能扫描到,具体可参考【第十二章】零配置 之 12.3 注解实现Bean定义 ——跟我学spring3

其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最有用,另外两个用处不大。

接下来看段代码:

Java代码  

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

如果你的spring-mvc配置文件使用如下方式扫描bean

Java代码  

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

需要把@ControllerAdvice包含进来,否则不起作用:

Java代码  

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

1、@ModelAttribute注解的方法作用请参考SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解——跟着开涛学SpringMVC中的【二、暴露表单引用对象为模型数据】,作用是一样的,只不过此处是对所有的@RequestMapping注解的方法都起作用。当需要设置全局数据时比较有用。

2、@InitBinder注解的方法作用请参考SpringMVC数据类型转换——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC,同1类似。当需要全局注册时比较有用。

3、@ExceptionHandler,异常处理器,此注解的作用是当出现其定义的异常时进行处理的方法,其可以使用springmvc提供的数
据绑定,比如注入HttpServletRequest等,还可以接受一个当前抛出的Throwable对象。可以参考javadoc或snowolf的Spring 注解学习手札(八)补遗——@ExceptionHandler

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

时间: 2024-11-06 07:28:21

Spring3.2新注解@ControllerAdvice的相关文章

Spring3.1新特性介绍

Spring3.1新特性 一.Spring2.5之前,我们都是通过实现Controller接口或其实现来定义我们的处理器类.   二.Spring2.5引入注解式处理器支持,通过@Controller 和 @RequestMapping注解定义我们的处理器类.并且提供了一组强大的注解:   需要通过处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter来开启支持@Controller 和 @Request

Spring3.1新特性

一.Spring2.5之前,我们都是通过实现Controller接口或其实现来定义我们的处理器类.   二.Spring2.5引入注解式处理器支持,通过@Controller 和 @RequestMapping注解定义我们的处理器类.并且提供了一组强大的注解:   需要通过处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter来开启支持@Controller 和 @RequestMapping注解的处理器

Spring3.1新特性(转)

一.Spring2.5之前,我们都是通过实现Controller接口或其他实现来定义我们的处理器类. 二.Spring2.5引入注解式处理器支持,通过@Controller 和 @RequestMapping注解定义我们的处理器类.并且提供了一组强大的注解:需要通过处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter来开启支持@Controller 和 @RequestMapping注解的处理器. @C

spring3.2+ehcache 注解使用

通过spring 拦截,实现颗粒度比较细,容易控制的缓存.了解了下,spring 3.0 以后,应该从3.1 以后吧,注解方式的缓存就已经实现,下面是我自己做的例子,分享给大家: 例子内容介绍: 1.没用数据库,用的集合里面的数据,也就没事务之类的,完成的一个CRUD操作 2.主要测试内容,包括第一次查询,和反复查询,缓存是否生效,更新之后数据同步的问题 3.同时含有一些常用参数绑定等东西 4.为了内容简单,我没有使用接口,就是User,UserControl,UserServer,UserDa

在Spring3中使用注解(@Scheduled)创建计划任务

Spring3中加强了注解的使用,其中计划任务也得到了增强,现在创建一个计划任务只需要两步就完成了: 创建一个Java类,添加一个无参无返回值的方法,在方法上用@Scheduled注解修饰一下: 在Spring配置文件中添加三个<task:**** />节点: 最后说明一下,第一步创建的Java类要成为Spring可管理的Bean,可以直接写在XML里,也可以@Component一下 计划任务类: /** * com.zywang.spring.task.SpringTaskDemo.java

JUnit扩展:引入新注解

发现问题 JUnit提供了Test Suite来帮助我们组织case,还提供了Category来帮助我们来给建立大的Test Set,比如BAT,MAT, Full Testing. 那么什么情况下,这些仍然不能满足我们的需求,需要进行拓展呢? 闲话不表,直接上需求: 1. 老板希望能精确的衡量出每个Sprint写了多少条自动化case,或者每个User Story又设计了多少条case来保证覆盖率,以此来对工作量和效率有数据上的直观表示.  2. 对于云服务,通常会有不同的server来对应产

spring3.0新特性

1.增加spring表达式支持. 2.通过java提供Ioc配置,增加注解,替换bean配置文件. 3.数据访问层新增OXM(xml文件),类似ORM. 4.WEB层增强,服务端提供 REST注解,调用端提供RestTemplate模板类,两方通过HttpConverter进行对象和http请求/响应的转换. (运行需要jdk5.0   编译需要6.0) 版权声明:本文为博主原创文章,未经博主允许不得转载.

Spring3.0MVC+MyBatis3.0+Spring3.0(全注解列子)

说明:      附件是项目截图及所需包截图      此项目在tomcat,weblogic10下测试通过 配置文件 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/

ssh2项目整合 struts2.1+hibernate3.3+spring3 基于hibernate注解和struts2注解

项目目录结构如下: 核心配置文件: web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLo