Spring MVC框架:第十七章:异常映射

简介: Spring MVC框架:第十七章:异常映射

异常映射

异常机制是Java程序中针对有可能发生的问题所提前作出的应急解决方案。在SpringMVC中可以通过异常映射的方式,将异常类型和某个视图名称对应起来,让用户不是看到异常信息,而是一个比较友好的界面。

局限性:同步请求需要一个新的页面时这样操作是没问题的,但是对于需要数据片段的异步请求来说,就会导致Ajax请求收到的响应无法解析。

解决方案:

在spring-mvc.xml

<!-- 配置异常映射机制 -->
<!-- 为了能够兼容异步请求的异常信息响应格式,所以使用自定义CrowdfundingExceptionResolver类 -->
<bean id="simpleMappingExceptionResolver" class="com.crowdfunding.component.resolver.CrowdfundingExceptionResolver">
   <property name="exceptionMappings">
       <props>
           <prop key="java.lang.Exception">error</prop>
       </props>
   </property>
</bean>

分布式架构中没有Spring-mvc.xml那我们应该怎么办呢?

可以使用注解,例如:

@ControllerAdvice
public class MyExceptionResolver{
  @ExceptionHandler(value=Exception.class)
  public String resolveException(Exception e, Model model){
    model.addAttribute("exception",e);
    return "error";
  }
}

重写异常解析器的doResolveException()方法

为什么要重写?

重写示例

public class CrowdfundingExceptionResolver extends SimpleMappingExceptionResolver {
    @Override
    protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) {
        //判断当前请求是否为异步请求.如果 X-Requested-With 为 null,则为同步请求。X-Requested-With 为 XMLHttpRequest 则为 Ajax 请求。
        if ((request.getHeader("accept").contains("application/json") || (request.getHeader("X-Requested-With") != null && request.getHeader("X-Requested-With").contains("XMLHttpRequest")))) {
            try {
                //创建ResultVO对象用来封装Ajax响应结果
                ResultVO<String> resultVO = new ResultVO<>();
                resultVO.setResult(ResultVO.FAILED);
                resultVO.setData(ResultVO.NO_DATA);
                resultVO.setMessage(ex.getMessage());
                //将resultVO对象转换为JSON数据
                Gson gson = new Gson();
                String json = gson.toJson(resultVO);
                //设置响应消息头
                response.setContentType("application/json;charset=UTF-8");
                //将resultVO的JSON数据返回给浏览器
                response.getWriter().write(json);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
        //如果不满足if条件说明是同步请求,则调用父类的方法按照常规方式处理
        return super.doResolveException(request, response, handler, ex);
    }
}

Gson的依赖

pom.xml

<dependency>
  <groupId>com.google.code.gson</groupId>
  <artifactId>gson</artifactId>
</dependency>
相关文章
|
19天前
|
缓存 Java 开发工具
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
三级缓存是Spring框架里,一个经典的技术点,它很好地解决了循环依赖的问题,也是很多面试中会被问到的问题,本文从源码入手,详细剖析Spring三级缓存的来龙去脉。
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
|
19天前
|
缓存 安全 Java
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
从底层源码入手,通过代码示例,追踪AnnotationConfigApplicationContext加载配置类、启动Spring容器的整个流程,并对IOC、BeanDefinition、PostProcesser等相关概念进行解释
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
|
19天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
21小时前
|
Java 关系型数据库 数据库连接
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第3天】Spring Boot项目中数据库连接问题可能源于配置错误或依赖缺失。YAML配置文件的格式不正确,如缩进错误,会导致解析失败;而数据库驱动不匹配、连接字符串或认证信息错误同样引发连接异常。解决方法包括检查并修正YAML格式,确认配置属性无误,以及添加正确的数据库驱动依赖。利用日志记录和异常信息分析可辅助问题排查。
22 10
|
10天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
527 8
|
7天前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
7天前
|
XML 前端开发 Java
控制spring框架注解介绍
控制spring框架注解介绍
|
7天前
|
存储 NoSQL Java
Spring Session框架
Spring Session 是一个用于在分布式环境中管理会话的框架,旨在解决传统基于 Servlet 容器的会话管理在集群和云环境中的局限性。它通过将用户会话数据存储在外部介质(如数据库或 Redis)中,实现了会话数据的跨服务器共享,提高了应用的可扩展性和性能。Spring Session 提供了无缝集成 Spring 框架的 API,支持会话过期策略、并发控制等功能,使开发者能够轻松实现高可用的会话管理。
Spring Session框架
|
15天前
|
Java 应用服务中间件 开发者
深入探索并实践Spring Boot框架
深入探索并实践Spring Boot框架
25 2
|
14天前
|
机器学习/深度学习 数据采集 JavaScript
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
ADR药品不良反应监测系统是一款智能化工具,用于监测和分析药品不良反应。该系统通过收集和分析病历、处方及实验室数据,快速识别潜在不良反应,提升用药安全性。系统采用Java开发,基于SpringBoot框架,前端使用Vue,具备数据采集、清洗、分析等功能模块,并能生成监测报告辅助医务人员决策。通过集成多种数据源并运用机器学习算法,系统可自动预警药品不良反应,有效减少药害事故,保障公众健康。
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
下一篇
无影云桌面