Spring 全家桶之 Spring Web MVC(九)- Exception(下)

简介: Spring 全家桶之 Spring Web MVC(九)- Exception

再次启动应用

image.png

控制台输出是由lhandlerArithmeticException处理的这个异常

image.png

如果有多个异常的情况下可以写多个异常处理的方法,指定处理的异常可以是具体的异常也可以是Exception类,当同时出现时精确匹配优先

在HandlerExceptionController中增异常处理方法,处理Exception类异常

// 专门处理异常的方法,指定类型
// 直接返回ModelAndView,将异常信息方法封装到对象中
@ExceptionHandler(Exception.class)
public ModelAndView handlerException(Exception e){
    System.out.println(this.getClass().getName() + "类中的handlerException()方法运行了");
    ModelAndView mv = new ModelAndView("error");
    mv.addObject("e", e);
    return mv;
}
复制代码

重新启动该应用

image.png

根据控制台的输出,可以确定不管是否是精确匹配,优先使用同一个类下的异常处理方法来处理异常

三、ResponseStatusExceptionResolver

如果想要处理自定义的异常,则需要用到@ResponseStatus注解来标注,该注解不能标在方法上。在handler()方法上标注@ResponseStatus注解,看看会发生什么

image.png

这会导致正常页面也出现报错

该注解需要标在自定义异常类上,HandlerExceptionController中新增一个方法handlerAlpha()

@RequestMapping("/alpha")
public String handlerAlpha(@RequestParam("username") String username){
    if (!"admin".equals(username)){
        System.out.println("不是Admin,登录失败");
        throw new NonAdminException();
    }
    return "success";
}
复制代码

定义一个异常类,当非管理员登录时抛出该异常

@ResponseStatus(value = HttpStatus.CONFLICT, reason = "不是管理员不能登录,走吧走吧.....")
public class NonAdminException extends RuntimeException {
}
复制代码

重启应用,当username为admin时,输出sucess页面

image.png

不是admin时,输出了指定的错误页面,并输出了异常信息

image.png

根据控制台的输出,可以确定该异常是被同一类下的异常处理方法处理的;注释HandlerExceptionController中的异常处理方法,将GlobalEXception中的Exception异常处理也注释掉;再次重启,浏览器中输入http://localhost:8080/alpha?username=admin111

image.png

四、DefaultHandlerExceptionResolver

HandlerExceptionController中新增一个方法

@PostMapping(value = "/bravo")
public String handlerBravo(){
    return "success";
}
复制代码

该方法是POST方法,重启应用,浏览器中输入localhost:8080/bravo

image.png

页面中的这段异常信息就是Spring MVC自定义的异常中的信息。开启GlobalException中的Exception处理方法

image.png

当GlobalException中的Exception处理方法被注释掉时,就是默认的DefaultHandlerExceptionResolver进行的处理

启动DEBUG模式,点击首页的bravo超链接

image.png

进入循环异常处理器列表的代码块中

image.png

多次Step Over后,只有DefaultHandlerExceptionResolver,可以处理这类异常

image.png

Step Into 到resolveException()这个方法中

image.png

继续Step Over

image.png

进入这个doResolveException()方法中

image.png

这里就包含了请求方法不支持的异常,也就是我们出现的异常

五、SimpleMappingExceptionResolver

SimpleMappingExceptionResolver是通过配置来进行异常处理的,在Spring MVC 配置文件中配置这个异常处理器

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
            <prop key="java.lang.NullPointerException">error</prop>
        </props>
    </property>
</bean>
复制代码

注释掉异常处理中的Exception异常处理方法,在HandlerExceptionController 新增一个方法模拟空指针异常

@RequestMapping("/charlie")
public String handleCharlie(){
    System.out.println("NullPointException.....");
    // 模拟空指针异常的情况
    String name = null;
    System.out.println(name.length());
    return "success";
}
复制代码

index页面增加超链接

<a href="/charlie">charlie</a>
复制代码

重新启动应用,点击index页面的超链接

image.png

没有出现错误信息,需要将错误信息保存,并修改Spring MVC配置文件才可以

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <!-- exceptionMappings:配置哪些异常去哪些页面 -->
    <property name="exceptionMappings">
        <props>
            <!-- key:异常全类名;value:要去的页面视图名; -->
            <prop key="java.lang.NullPointerException">error</prop>
        </props>
    </property>
    <!--指定错误信息取出时使用的key  -->
    <property name="exceptionAttribute" value="e"></property>
</bean>
复制代码

error页面通过配置的e或者默认的exception来去除错误信息

${e} - ${exception}

image.png

如果全局异常处理存在处理空指针的方法

image.png

会优先使用全局的异常处理来处理,如果全部不能处理,在使用配置的方式处理

开启Debug模式

image.png

现在有四个全局异常处理器,SimpleMapping排在最后,第一个异常处理器就可以将这类异常处理掉,处理完成之后就不会使用其余3个异常处理器处理异常了。


相关文章
|
1月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
42 4
|
1月前
|
监控 Java Linux
问题回顾:Unable to start web server; nested exception is org.springframework.boot.web.server.
解决“Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException”这一问题,关键在于细致的故障诊断和逻辑推理。从日志入手,逐步排查端口冲突、依赖问题、配置错误、资源限制、代码bug以及版本兼容性等多个方面,最终定位并解决根本原因。每一步操作都应谨慎且有针对性,确保修改一处后充分测试,避免引入新的问题。
90 0
|
2月前
|
前端开发 安全 Java
技术进阶:使用Spring MVC构建适应未来的响应式Web应用
【9月更文挑战第2天】随着移动设备的普及,响应式设计至关重要。Spring MVC作为强大的Java Web框架,助力开发者创建适应多屏的应用。本文推荐使用Thymeleaf整合视图,通过简洁的HTML代码提高前端灵活性;采用`@ResponseBody`与`Callable`实现异步处理,优化应用响应速度;运用`@ControllerAdvice`统一异常管理,保持代码整洁;借助Jackson简化JSON处理;利用Spring Security增强安全性;并强调测试的重要性。遵循这些实践,将大幅提升开发效率和应用质量。
64 7
|
2月前
|
前端开发 测试技术 开发者
MVC模式在现代Web开发中有哪些优势和局限性?
MVC模式在现代Web开发中有哪些优势和局限性?
|
3月前
|
开发者 前端开发 Java
架构模式的诗与远方:如何在MVC的田野上,用Struts 2编织Web开发的新篇章
【8月更文挑战第31天】架构模式是软件开发的核心概念,MVC(Model-View-Controller)通过清晰的分层和职责分离,成为广泛采用的模式。随着业务需求的复杂化,Struts 2框架应运而生,继承MVC优点并引入更多功能。本文探讨从MVC到Struts 2的演进,强调架构模式的重要性。MVC将应用程序分为模型、视图和控制器三部分,提高模块化和可维护性。
47 0
|
3月前
|
Java Spring Maven
Struts 2遇见Spring:这个组合如何颠覆你的Web开发?
【8月更文挑战第31天】在现代Web开发中,Struts 2与Spring的结合使用能显著增强应用的模块化和可维护性。本文将介绍如何整合这两个框架,并提供代码示例。首先,在`pom.xml`中添加Struts 2和Spring的依赖,然后在`struts.xml`中配置Struts 2以识别Spring插件。接着,在Spring配置文件中定义bean,并在Struts 2的Action类中使用`@Autowired`注解进行自动注入。
50 0
|
3月前
|
Java 开发者 前端开发
Struts 2、Spring MVC、Play Framework 上演巅峰之战,Web 开发的未来何去何从?
【8月更文挑战第31天】在Web应用开发中,Struts 2框架因强大功能和灵活配置备受青睐,但开发者常遇配置错误、类型转换失败、标签属性设置不当及异常处理等问题。本文通过实例解析常见难题与解决方案,如配置文件中遗漏`result`元素致页面跳转失败、日期格式不匹配需自定义转换器、`&lt;s:checkbox&gt;`标签缺少`label`属性致显示不全及Action中未捕获异常影响用户体验等,助您有效应对挑战。
89 0
|
3月前
|
Java Spring
🔥JSF 与 Spring 强强联手:打造高效、灵活的 Web 应用新标杆!💪 你还不知道吗?
【8月更文挑战第31天】JavaServer Faces(JSF)与 Spring 框架是常用的 Java Web 技术。本文介绍如何整合两者,发挥各自优势,构建高效灵活的 Web 应用。首先通过 `web.xml` 和 `ContextLoaderListener` 配置 Spring 上下文,在 `applicationContext.xml` 定义 Bean。接着使用 `@Autowired` 将 Spring 管理的 Bean 注入到 JSF 管理的 Bean 中。
66 0
|
3月前
|
Java Spring Apache
Spring Boot邂逅Apache Wicket:一次意想不到的完美邂逅,竟让Web开发变得如此简单?
【8月更文挑战第31天】Apache Wicket与Spring Boot的集成提供了近乎无缝的开发体验。Wicket以其简洁的API和强大的组件化设计著称,而Spring Boot则以开箱即用的便捷性赢得开发者青睐。本文将指导你如何在Spring Boot项目中引入Wicket,通过简单的步骤完成集成配置。首先,创建一个新的Spring Boot项目并在`pom.xml`中添加Wicket相关依赖。
100 0
|
3月前
|
Java 前端开发 Apache
Apache Wicket与Spring MVC等Java Web框架大PK,究竟谁才是你的最佳拍档?点击揭秘!
【8月更文挑战第31天】在Java Web开发领域,众多框架各具特色。Apache Wicket以组件化开发和易用性脱颖而出,提高了代码的可维护性和可读性。相比之下,Spring MVC拥有强大的生态系统,但学习曲线较陡;JSF与Java EE紧密集成,但在性能和灵活性上略逊一筹;Struts2虽成熟,但在RESTful API支持上不足。选择框架时还需考虑社区支持和文档完善程度。希望本文能帮助开发者找到最适合自己的框架。
46 0
下一篇
无影云桌面