在 SpringMVC, SpringBoot 处理 web 请求时, 若遇到错误或者异常,返回给用户一个良好的错误信息比 Whitelabel Error Page 好的多。 SpringMVC 提供了三种异常处理方式, 良好的运用它们可以给用户提供可读的错误信息【阿酋联源码论坛:aqiulian.com】迪士尼cp源码Q_212303635。
实现 HandlerExceptionResolver
public class AppHandlerExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
ModelAndView mav = new ModelAndView();
mav.addObject(“message”, ex.getMessage());
// 可以设置视图名导向错误页面
mav.setViewName("/error");
// 直接返回视图
// 如果返回 null,则会调用下一个 HandlerExceptionResolver
return mav;
}
}
然后配置一个 HandlerExceptionResolver
@Beanpublic AppHandlerExceptionResolver appHandlerExceptionResolver() {
return new AppHandlerExceptionResolver();
}
HandlerExceptionResolver 的实现类会 catch 到 @Controller 方法执行时发生的异常,处理后返回 ModelAndView 作为结果视图,因此可以通过它来定制异常视图。
HandlerExceptionResolver 只能捕获 @Controller 层发生的异常(包括 @Controller 调用 @Service 发生的异常),其他地方的异常,比如访问了一个不存在的路径,不会被 HandlerExceptionResolver 捕获,此时会跳到 ErrorController 处理, 下面会说到。
通过 @ControllerAdvice 和 @ExceptionHandler 注解
// 可以配置拦截指定的类或者包等// @RestControllerAdvice 使 @ExceptionHandler 注解的方法默认具有 @ResponseBody 注解@RestControllerAdvice(basePackageClasses = HelloWorldController.class)public class AppExceptionHandlerAdvice {
// 配置拦截的错误类型
// 这里也可以返回 ModelAndView 导向错误视图
@ExceptionHandler(Exception.class)
public ResponseEntity responseEntity(Exception e) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
Map<String, Object> map = new HashMap<>();
map.put(“status”, 400);
map.put(“message”, e.getMessage());
// 直接返回结果
return new ResponseEntity<>(map, headers, HttpStatus.BAD_REQUEST);
}
}
这种方式配置的异常处理由 HandlerExceptionResolver 的默认实现类 HandlerExceptionResolverComposite 处理,因此也只能捕获 @Controller 层的异常。
@ExceptionHandler 可以返回 ModelAndView 定制异常视图。
@ControllerAdvice 可以拦截特定的类,@ExceptionHandler 可以拦截特定的异常,因此可以更精确的配置异常处理逻辑。
@ExceptionHandler 可以在 @Controller 类中声明,此时只能处理同一个类的异常
自定义 ErrorController bean
@RestController@RequestMapping("/error")public class AppErrorController extends AbstractErrorController {
public AppErrorController(ErrorAttributes errorAttributes) {
super(errorAttributes);
}
@RequestMapping
public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
Map<String, Object> body = getErrorAttributes(request, false);
HttpStatus status = getStatus(request);
// 返回响应体
return new ResponseEntity<>(body, status);
}
@Override
public String getErrorPath() {
return “/error”;
}
}
如果没有配置 ErrorController, SpringBoot 会通过 ErrorMvcAutoConfiguration 自动配置一个,默认的实现类为 BasicErrorController。
ErrorController 可以处理非 @Controller 层抛出的异常,例如常见的访问了一个不存在的路径。
ErrorController 可以进行统一的错误处理,即让 HandlerExceptionResolver 返回的 ModelAndView 导向错误页面
分享到:
相关推荐
springMvc源码分析springMvc源码分析springMvc源码分析springMvc源码分析springMvc源码分析springMvc源码分析
- 对文件名进行安全处理,避免路径遍历等安全问题。 8. **最佳实践**: - 使用异步上传以改善用户体验,特别是在上传大文件时。 - 实现错误处理和重试机制,提高上传的成功率。 通过上述步骤,我们可以创建一个...
5. **异常处理**:提供了一套统一的异常处理机制,将系统异常转化为用户友好的错误页面,便于进行异常管理和用户体验优化。 6. **国际化**:内置了便捷的国际化支持,可以轻松实现多语言环境下的应用开发。 7. **...
- 小项目源码:可以直接运行和调试,加深对实际开发流程的理解。 - 整合 Hibernate:理解如何在 Spring MVC 中配置和使用 Hibernate,实现数据访问。 在学习过程中,你可以逐步理解 Spring MVC 的组件和工作原理...
本文将深入探讨Spring、SpringMVC和SpringBoot的源码,帮助你理解和掌握这三大框架的关键知识点,从而在金三银四的Java面试中脱颖而出。 首先,让我们从Spring框架开始。Spring的核心是依赖注入(Dependency ...
SpringMVC作为Spring框架的一部分,主要用于构建Web应用程序的Model-View-Controller(MVC)架构,而iBatis则是一个轻量级的持久层框架,它将SQL语句与Java代码分离,提供了灵活的数据库操作方式。 SpringMVC的核心...
标题中的“Spring+SpringMVC+Mybatis框架整合源码”指的是一个基于Java的Web开发项目,它结合了三个主流的开源框架:Spring、SpringMVC和Mybatis,以实现高效且灵活的企业级应用开发。这三种框架在Java世界中扮演着...
通过"SpringMVC学习版源码",初学者可以详细查看这些组件的实现,理解它们如何协同工作,从而加深对SpringMVC的理解。MySpringMVC可能是该项目的主模块,包含了整个SpringMVC应用的配置、控制器、模型、视图等组件。...
SpringMVC提供了一种优雅的方式来处理应用中的异常。通过`@ExceptionHandler`注解,可以在控制器中定义特定异常的处理方法。此外,全局异常处理器(`@ControllerAdvice`)可以捕获所有控制器的异常,实现统一的错误...
1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析...
在这个"SpringMVC demo 完整源码实例下载"中,我们能够深入理解并学习SpringMVC的核心概念和实际应用。 首先,SpringMVC是Spring框架的一部分,它通过Model-View-Controller(MVC)设计模式来分离应用程序的业务...
springmvc异常处理的博文如下: http://blog.csdn.net/dlf123321/article/details/50756003
SpringMVC提供了全局异常处理机制,通过@ControllerAdvice和@ExceptionHandler注解,可以集中处理所有控制器中的异常。 7. **数据绑定与验证** SpringMVC支持模型对象的数据绑定和验证,例如,使用@...
异常处理器(HandlerExceptionResolver)能够捕获和处理控制器抛出的异常,提供统一的错误页面。 在源码学习过程中,你可能会遇到以下关键类和接口:`RequestMappingHandlerMapping`, `...
9. **异常处理**:SpringMVC提供了一套优雅的异常处理机制,允许开发者定义全局和特定异常的处理策略。 10. **参数绑定**:自动将请求参数绑定到控制器方法的参数上,支持基本类型、复杂类型以及自定义类型转换器。...
异常处理在Web应用中至关重要,SpringMVC允许我们定义全局和局部异常处理器。GlobalExceptionResolver或@ControllerAdvice注解可以捕获并处理特定类型的异常,提供友好的错误页面或JSON响应。 拦截器是SpringMVC中...
Maven搭建SpringMVC+Hibernate项目源码,包括Hibernate二级缓存Ehcache的搭建等等,博文地址:http://blog.csdn.net/fengshizty/article/details/43635305
springmvc返回json的全局异常统一处理demo,有问题可以留言。
在这个"SpringMvc学习系列整合源码"中,你将有机会深入理解SSM(Spring、SpringMVC、MyBatis)框架的集成和工作原理。 首先,Spring作为基础框架,负责管理应用的组件,包括依赖注入(DI)和面向切面编程(AOP)。...
SpringMVC是Spring框架的一部分,它提供了一种模型-视图-控制器(MVC)架构来构建Web应用程序。我们将主要关注以下几个核心知识点: 1. **SpringMVC 概述** SpringMVC是一个轻量级的Web开发框架,它简化了处理HTTP...