SpringMVC之ControllerAdvice
SpringMVC从3.2版本开始提供了一个org.springframework.web.bind.annotation.ControllerAdvice
注解,使用它标注的Class在启用了注解的支持时,在进行Class扫描时能够自动扫描到它,因为它上面使用了org.springframework.stereotype.Component
注解标注。ControllerAdvice标注的Class的作用是用来辅助Controller的,我们可以在ControllerAdvice标注的Class中使用@ExceptionHandler
、@InitBinder
和@ModelAttribute
标记对应的方法,以便它们可以对指定范围内的Controller起作用。@ExceptionHandler
是用来进行异常处理的,关于它的介绍可以参考笔者以前写的一篇博文http://elim.iteye.com/blog/1188161。关于@InitBinder
的介绍可以参考笔者以前写的http://elim.iteye.com/blog/1190065。关于@ModelAttribute
的介绍可以参考笔者写的http://elim.iteye.com/blog/1753271。在没有ControllerAdvice时,我们定义的@ExceptionHandler
、@InitBinder
和@ModelAttribute
都只能在Controller中对当前Controller生效,如果需要让更多的Controller应用相同的逻辑,只能把它们定义在共同的父类中。有了ControllerAdvice后则可以把它们定义在使用@ControllerAdvice
标注的Class中。比如下面的示例中就在ControllerAdvice标注的Class中定义了两个使用ExceptionHandler标注的方法以处理对应的异常,其中handleException()
方法将用来处理除java.lang.IllegalStateException
以外的所有其它异常,它的处理结果是转到一个固定的视图上。而handleIllegalStateException()
将用来处理java.lang.IllegalStateException
,它的处理结果是以JSON的形式响应的。
@ControllerAdvice
public class DefaultExceptionHandler {
/**
* 该方法将处理SpringMVC处理过程中抛出的所有的异常,
* 将使用该方法的返回值来替换正常的Controller方法的返回值
* @param e
* @return
*/
@ExceptionHandler(Exception.class)
public ModelAndView handleException(Exception e) {
return new ModelAndView("viewName");
}
/**
* 该方法将处理SpringMVC过程中抛出的所有的java.lang.IllegalStateException,
* 而其它异常的处理还由上面定义的handleException()处理。当抛出了一个异常可以同时被
* 多个@ExceptionHandler标注的方法处理时,对应的异常将交由更精确的异常处理方法处理。
*
* 且抛出该异常时将把处理结果以@ResponseBody的形式返回,此时将被当作JSON返回。
* @param e
* @return
*/
@ExceptionHandler(IllegalStateException.class)
@ResponseBody
public Object handleIllegalStateException(IllegalStateException e) {
Map<String, Object> jsonObj = new HashMap<>();
jsonObj.put("errorMessage", e.getMessage());
return jsonObj;
}
}
在@ExceptionHandler标注的处理方法中如果希望获取到当前抛出的异常,则可以在方法参数中声明一个需要处理的异常类型的参数,SpringMVC在调用对应的处理方法处理异常时将传递当前的异常对象。 @ExceptionHandler标注的处理方法可以声明任何正常的处理器方法可以声明的参数类型,比如HttpServletRequest、HttpServletResponse、java.util.Map、Model等。 @ExceptionHandler标注的处理方法的返回结果也可以跟正常的Controller处理方法拥有一样的返回类型,比如String、Model、ModelAndView、void、Object等,所以我们可以把它看作是和Controller处理方法等价的方法定义的这么一个方法。
ControllerAdvice定义的Class是有作用范围的,默认情况下,什么参数都不指定时它的作用范围是所有的范围。ControllerAdvice提供了一些可以缩小它的处理范围的参数。
- value:数组类型,用来指定可以作用的基包,即将对指定的包下面的Controller及其子包下面的Controller起作用。
- basePackages:数组类型,等价于value。
- basePackageClasses:数组类型,此时的基包将以指定的Class所在的包为准。
- assignableTypes:数组类型,用来指定具体的Controller类型,它可以是一个共同的接口或父类等。
- annotations:数组类型,用来指定Class上拥有指定的注解的Controller。
1、下面的ControllerAdvice将对定义在com.elim.app.mvc.controller
包及其子包中的Controller起作用。
@ControllerAdvice(value="com.elim.app.mvc.controller")
public class DefaultExceptionHandler {
//...
}
2、下面的ControllerAdvice也将对定义在com.elim.app.mvc.controller
包及其子包中的Controller起作用。
@ControllerAdvice(basePackages="com.elim.app.mvc.controller")
public class DefaultExceptionHandler {
//...
}
3、下面的ControllerAdvice也将对定义在com.elim.app.mvc.controller
包及其子包中的Controller起作用。它通过basePackageClasses指定了需要作为基包的Class,此时基包将以basePackageClasses指定的Class所在的包为准,即com.elim.app.mvc.controller
。
@ControllerAdvice(basePackageClasses=com.elim.app.mvc.controller.Package.class)
public class DefaultExceptionHandler {
//...
}
4、下面的ControllerAdvice将对FooController及其子类型的Controller起作用。
@ControllerAdvice(assignableTypes=FooController.class)
public class DefaultExceptionHandler {
//...
}
5、下面的ControllerAdvice将对所有Class上使用了RestController注解标注的Controller起作用。
@ControllerAdvice(annotations=RestController.class)
public class DefaultExceptionHandler {
//...
}
6、也可以同时指定多个属性,比如下面的ControllerAdvice将对FooController及其子类型的Controller起作用,同时也将对com.elim.app.mvc.controller包及其子包下面的Controller起作用。
@ControllerAdvice(assignableTypes=FooController.class, basePackages="com.elim.app.mvc.controller")
public class DefaultExceptionHandler {
//...
}
当一个异常可以同时被多个ControllerAdvice的@ExceptionHandler标注的方法处理时只有第一个匹配的处理器方法可以处理。
(本文是基于Spring4.1.0所写)
相关推荐
主要介绍了SpringMVC @ControllerAdvice使用场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
- SpringMVC通过@ControllerAdvice和@ExceptionHandler注解实现全局异常处理。 - 可以定义一个全局的异常处理器,处理所有Controller中抛出的异常,提供统一的错误页面或JSON响应。 通过以上知识点的学习,读者...
GlobalExceptionResolver或@ControllerAdvice注解可以捕获并处理特定类型的异常,提供友好的错误页面或JSON响应。 拦截器是SpringMVC中的另一个强大特性,它可以增强应用的功能,如权限验证、日志记录、性能统计等...
SpringMVC允许我们定义全局的异常处理器,如@ControllerAdvice和@ExceptionHandler,以便统一处理可能出现的运行时异常,提高程序的健壮性。 拦截器(Interceptor)是SpringMVC中一种强大的工具,可以拦截请求并在...
SpringMVC允许定义全局或特定类型的异常处理器,通过@ControllerAdvice和@ExceptionHandler注解实现。 8. **视图解析**: 视图解析器如InternalResourceViewResolver,负责根据视图名查找实际的视图资源。例如,...
4. **改进的异常处理**:SpringMVC 5.0提供了更好的全局异常处理机制,你可以通过定义`@ControllerAdvice`类来集中处理异常,使代码更加整洁。 5. **WebSocket支持**:SpringMVC 5.0加强了WebSocket的支持,通过`@...
5. 异常处理:讨论全局异常处理器(@ControllerAdvice)的配置和使用,以及如何自定义异常页面。 6. AOP在SpringMVC中的应用:介绍如何利用Spring的面向切面编程特性进行日志记录、事务管理等。 总之,《黑马程序员...
计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习...
- 可以通过@ControllerAdvice和@ExceptionHandler全局处理异常,提高代码的可读性和可维护性。 14. **RESTful API支持**: - SpringMVC支持创建RESTful服务,通过@RequestMapping的GET、POST、PUT、DELETE等HTTP...
可以通过@ControllerAdvice和@ExceptionHandler全局处理异常,提供统一的错误页面。 8. **RESTful API支持**: SpringMVC支持创建符合RESTful风格的Web服务,通过HTTP动词(GET、POST、PUT、DELETE等)和URI资源...
11. **异常处理**:SpringMVC提供了一种优雅的异常处理机制,通过@ControllerAdvice和@ExceptionHandler注解,可以全局处理特定类型的异常。 12. **上传下载**:SpringMVC支持文件的上传和下载,通过MultipartFile...
10. **异常处理**:通过@ControllerAdvice和@ExceptionHandler注解,可以全局统一处理异常,提供友好的错误提示。 本入门案例源码中,开发者可以学习到如何配置SpringMVC环境,创建和注册Controller,处理请求和...
SpringMVC允许通过@ControllerAdvice和@ExceptionHandler注解实现全局异常处理。 九、单元测试 SpringMVC提供了MockMVC工具,可以在不运行整个Web服务器的情况下对控制器进行单元测试。 十、总结 SpringMVC是一个...
在处理异常方面,SpringMVC提供了一种声明式的方式,通过@ControllerAdvice和@ExceptionHandler注解可以定义全局的异常处理器,从而集中处理可能出现的错误情况。 此外,Spring4.3.7版本引入了一些优化,比如对...
通过定义@ControllerAdvice和@ExceptionHandler注解,可以实现全局异常处理,捕获并处理所有Controller中的未捕获异常。 七、记录异常到日志: 结合日志框架(如Log4j或SLF4J),在全局异常处理中记录异常信息。 ...
可以使用@ControllerAdvice和@ExceptionHandler注解全局处理可能出现的异常,向用户友好地展示错误信息。 总结起来,使用SpringMVC实现登录功能涉及的知识点包括:SpringMVC的MVC架构、Controller的请求处理、模型...
此外,全局异常处理器(`@ControllerAdvice`)可以捕获所有控制器的异常,实现统一的错误处理。 7. **MVC配置**: 在SpringMVC中,配置可以通过XML、Java配置类或者基于注解的配置完成。现代实践中,基于Java配置...
可以通过定义`@ControllerAdvice`注解的类来全局处理异常,或者在特定控制器中使用`@ExceptionHandler`注解来捕获和处理特定类型的异常。 6. **视图层技术**: SpringMVC可以与各种视图技术集成,如JSP、...
通过@ControllerAdvice和@ExceptionHandler,可以全局捕获和处理异常,提供统一的错误页面或JSON响应。 **总结** SpringMVC以其强大的功能和高度的灵活性,成为Java Web开发中广泛使用的框架。通过理解并熟练掌握...
4. **异常处理(Exception Handling)**:通过@ControllerAdvice和@ExceptionHandler注解,可以全局处理控制器中的异常,提供了统一的错误页面和API响应。 5. **数据绑定与验证(Data Binding and Validation)**:...