`
Adan-Chiu
  • 浏览: 19991 次
社区版块
存档分类
最新评论

spring mvc 为控制器添加通知

阅读更多

为控制器添加通知

与SpringAOP一样,SpringMVC也可以为控制器加入通知,它主要涉及4个注解:

  • @ControllerAdvice:作用于类,用以标识全局性的控制的拦截器,将应用于对应的控制器
  • @InitBinder:允许在构造控制器参数的时候,加入一定的自定义控制
  • @ExceptionHandler:当控制器发生异常时,就会跳转到该方法上
  • @ModelAttribute:先于控制器方法执行,当标注方法返回对象时,会保存到数据模型中,并传递给拦截的控制器

一个控制器通知的实例。

//标识控制器通知,并且指定对应的包
@ControllerAdvice(basePackages = {"com.wise.tiger.controller.advice"})
public class CommonControllerAdvice {
	/**
	 * 定义http对应参数处理规则
	 */
	@InitBinder
    public void initBinder(WebDataBinder binder){
		//针对日期类型的格式化,其中CustomDateEditor是客户自定义编辑器
		//boolean值表示是否允许为空
        binder.registerCustomEditor(Date.class,
        		new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),
        				false));
    }

    @ModelAttribute //处理数据模型
    public void populateModel(Model model){
        model.addAttribute("projectName","peppa");
    }
	//被拦截控制器出现Exception异常时,会调用该方法,该方法返回会返回exception视图
    @ExceptionHandler(Exception.class)
    public String exception(){
        return "exception";
    }
}

 

  • @ControllerAdvice已经标记了@Component,它的属性packages则是指定拦截的控制器,然后通过注解@InitBinder可以获得一个参数----WebDataBinder,它是一个可以指定pojo参数属性转换的数据绑定。这里被拦截到的控制器关于日期对象的参数都会被它处理不需要我们自己制定Formatter了。
  • @ModelAttribute是关于数据模型的,它会在进入控制器方法前运行,加入一个数据模型键值对"projectName"->"peppa".
  • @ExceptionHandler作用是制定被拦截到的控制器发生异常后,如果异常匹配,就会使用该方法处理,返回视图exception去响应,这样可以避免异常页面的不友好

       也可以在控制器当中使用@InitBinder、@ExceptionHandler、@ModelAttribute,此时标注的方法只对当前控制器有效,控制器形参可以通过@ModelAttribute("参数名")获得提前保存在数据模型中的数据,拿上面的例子来说,如果一个控制器方法想获得projectName参数的值:

 

@RequestMapping(value="getProjectName")
public String getProjectName(@ModelAttribute("projectName") String name){
          System.out.println(name);//name的最终值为peppa
}
 

 

处理异常

        控制器的通知注解@ExceptionHandler可以处理异常,此外,spring mvc还提供了其他的异常处理机制,使用它们可以获取更为精确的信息,从而为定位问题带来方便。在默认情况下,spring会将自身产生的异常转换为合适的状态码,通过这些状态码可以进一步确定异常发生的原因,以便找到对应的问题。

                              spring中部分异常默认映射码

Spring异常 HTTP状态码
BindException 400 - Bad Request
ConversionNotSupportedException 500 - Internal Server Error
HttpMediaTypeNotAcceptableException 406 - Not Acceptable
HttpMediaTypeNotSupportedException 415 - Unsupported Media Type
HttpMessageNotReadableException 400 - Bad Request
HttpMessageNotWritableException 500 - Internal Server Error
HttpRequestMethodNotSupportedException 405 - Method Not Allowed
MethodArgumentNotValidException 400 - Bad Request
MissingServletRequestParameterException 400 - Bad Request
MissingServletRequesPartException 400 - Bad Request
NoSuchRequestHandlingMethodException 404 - Not Found
TypeMismatchException 400 - Bad Request

 

有时候可以自定义一些异常,比如定义一个找不到角色异常

 

@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "找不到角色信息异常")
public class RoleException extends RuntimeException {
    // ...
}
 通过注解@ResponseStatus将异常映射为某一种状态码,通过配置reason可以了解配置产生异常的原因。

 

  • 处理方式一:通过配置专门的错误页(可以在web.xml中使用<error-page>标签进行配置)进行处理 
<web-app>
    <error-page>
        <error-code>404</error-code>
        <location>/404.html</location>
    </error-page>
</web-app>
  • 处理方式二: 在Controller中添加一个或多个用于处理异常的方法并在方法上用@ExceptionHandler加以注解,并指明该方法可以处理的异常类型,该方法可以返回错误视图的视图名或者返回ModelAndView对象
    @Controller
    public class RoleController {
        //当前控制器发生RoleException异常时,进入该方法
        @ExceptionHandler(RoleException.class)
        public String handleRoleException(Model model, RoleException ex) {
            model.addAttribute("hint", ex.getMessage());
            //返回指定的页面,避免不友好
            return "error";
        }
    }
  • 处理方式三:多个控制器有公共的异常需要统一处理,那么可以通过@ControllerAdvice为控制器写一个处理异常的Advice
    @ControllerAdvice
    public class ControllerExceptionAdvice {
        @ExceptionHandler(RoleException.class)
        public ModelAndView handleRE(Model model, RoleException ex) {
            ModelAndView mav = new ModelAndView("error");
            mav.addObject("hint", ex.getMessage());
            return mav;
        }
    }
     
分享到:
评论

相关推荐

    Spring-Reference_zh_CN(Spring中文参考手册)

    标准MVC控制器代码 14.5.1.3. 把模型数据转化为XML 14.5.1.4. 定义视图属性 14.5.1.5. 文档转换 14.5.2. 小结 14.6. 文档视图(PDF/Excel) 14.6.1. 简介 14.6.2. 配置和安装 14.6.2.1. 文档视图定义 14.6.2.2. ...

    spring in action英文版

     1.1 为什么使用Spring  1.1.1 J2EE开发者的一天  1.1.2 Spring的承诺  1.2 Spring是什么  1.3 开始Spring之旅  1.4 理解反向控制  1.4.1 依赖注入  1.4.2 IoC应用  1.4.3 企业级应用中的...

    Spring in Action(第二版 中文高清版).part2

    B.2 单元测试Spring MVC控制器 B.2.1 模拟对象 B.2.2 断言ModelAndView的内容 B.3 使用Spring进行综合测试 B.3.1 测试装配后的对象 B.3.2 综合测试事务处理对象 B.3.3 测试数据库 B.3.4 使用Gienah Testing在...

    Spring in Action(第二版 中文高清版).part1

    B.2 单元测试Spring MVC控制器 B.2.1 模拟对象 B.2.2 断言ModelAndView的内容 B.3 使用Spring进行综合测试 B.3.1 测试装配后的对象 B.3.2 综合测试事务处理对象 B.3.3 测试数据库 B.3.4 使用Gienah Testing在...

    Spring攻略(第二版 中文高清版).part1

    13.3 Spring MVC控制器的单元测试 518 13.3.1 问题 518 13.3.2 解决方案 518 13.3.3 工作原理 518 13.4 管理集成测试中的应用上下文 520 13.4.1 问题 520 13.4.2 解决方案 520 13.4.3 工作原理 521 ...

    Spring攻略(第二版 中文高清版).part2

    13.3 Spring MVC控制器的单元测试 518 13.3.1 问题 518 13.3.2 解决方案 518 13.3.3 工作原理 518 13.4 管理集成测试中的应用上下文 520 13.4.1 问题 520 13.4.2 解决方案 520 13.4.3 工作原理 521 ...

    weixin135房屋租赁管理系统的设计与实现+ssm--论文pf.rar

    Spring MVC:作为Spring的一个模块,提供了构建Web应用程序的MVC(模型-视图-控制器)设计模式的完整实现。 MyBatis:一个优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射,并且避免了几乎所有的JDBC代码...

    weixin043培训机构客户管理系统的设计+ssm(源码+部署说明+演示视频+源码介绍+lw).rar

    Spring MVC:作为Web层的框架,它负责处理用户请求、数据绑定、视图解析等,以实现MVC(模型-视图-控制器)设计模式。 MyBatis:一个持久层框架,它简化了数据库操作,通过XML或注解将对象与SQL语句映射起来,便于...

    ssm项目智慧物业平台修改5.5.zip

    SSM项目智慧物业平台修改5.5.zip是一个升级版的Java Web应用,它继续采用SSM(Spring Spring MVC MyBatis)框架,并结合了微信小程序前端技术。该系统为物业公司和社区居民提供更加智能化的物业管理服务,用户能够在...

    weixin010微信阅读小程序+ssm(源码+部署说明+演示视频+源码介绍+lw).rar

    SpringMVC:作为Spring的一部分,它是一个模型-视图-控制器(MVC)框架,用于构建Web应用程序。 MyBatis:一个持久层框架,它简化了数据库操作,使得与数据库的交互更加直观和灵活。 Maven:一个项目管理工具,用于...

    Java Web程序设计教程

    11.3.2为bean添加属性 232 11.3.3简化配置 233 11.4理解spring的核心——ioc 234 11.4.1控制反转 234 11.4.2依赖注入的3种方式 236 11.5beanfactory与applicationcontext 238 11.5.1认识beanfactory 238 ...

    JAVA程序开发大全---上半部分

    以及基于这些技术的商业化应用程序的开发技巧,在讲解过程中以目前最为流行的开发工具MyEclipse为载体,全面系统地介绍了如何在MyEclipse中开发基于Struts、Hibernate、Spring等主流框架的各种Java应用程序。...

    java面试题

    73.2. 为什么要用Spring? 76 73.3. spring工作机制或工作原理 76 73.4. Spring是什么?根据你的理解详细谈谈你的见解。 76 73.5. 项目中如何体现Spring中的切面编程,具体说明。 77 73.6. 项目中用到的Spring中的切...

    J2eeFAST企业级快速开发平台-其他

    J2eeFAST是一个Java EE企业级快速开发平台,基于经典技术组合(Spring Boot、Spring MVC、Apache Shiro、MyBatis-Plus、Freemarker、Bootstrap、AdminLTE)采用经典开发模式,让初学者能够更快的入门并投入到团队...

    J2eeFAST企业级快速开发平台 v2.0.8

    是一个Java EE企业级快速开发平台,基于经典技术组合(Spring Boot、Spring MVC、Apache Shiro、MyBatis-Plus、Freemarker、Bootstrap、AdminLTE)采用经典开发模式,让初学者能够更快的入门并投入到团队开发中去。...

    JAVA上百实例源码以及开源项目源代码

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    JAVA上百实例源码以及开源项目

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持,Spring做管理,管理Struts和Hibernate。 WebStorage HTML新增的本地存储解决...

    asp.net知识库

    体验.net2.0的优雅(3) -- 为您的 SiteMap 添加 控制转发功能 GridView控件使用经验 ASP.NET 2.0:弃用 DataGrid 吧,有新的网格控件了! ASP.NET2.0控件一览---标准控件(1) ASP.NET2.0控件一览---标准控件(2) ASP...

Global site tag (gtag.js) - Google Analytics