`
阅读更多

SpringBoot自定义错误信息,SpringBoot自定义异常处理类,

SpringBoot异常结果处理适配页面及Ajax请求,

SpringBoot适配Ajax请求

 

================================

©Copyright 蕃薯耀 2018年3月29日

http://fanshuyao.iteye.com/

 

一、自定义异常处理类:

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

import com.lqy.springboot.component.CustomErrorAttribute;

@ControllerAdvice
public class CustomExceptionHandler {
	
	/**
	 * 自定义异常数据
	 * 缺点,没有适配页面和Ajax请求,返回的数据都是json数据
	 * @param req
	 * @return
	 */
	/*@ResponseBody
	@ExceptionHandler(Exception.class)
	public Map<String, Object> exceptionHandler(HttpServletRequest req){
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("errorCode", 500);
		map.put("errorMsg", "错误信息");
		map.put("errorSystem", "errorSystem");
		return map;
	}*/
	
	/**
	 * 自定义异常数据
	 * 适配页面和Ajax请求
	 * 注解ExceptionHandler(Exception.class)的Exception.class可以替换成自己定义的错误异常类
	 * @param req
	 * @return
	 */
	@ExceptionHandler(Exception.class)
	public String exceptionHandler(HttpServletRequest req){
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("errorCode", 500);
		map.put("errorMsg", "错误信息");
		map.put("errorSystem", "errorSystem");
		req.setAttribute(CustomErrorAttribute.CUSTOM_ERROR_MAP_NAME, map);
		
		//传入自己的错误代码,必须的,否则不会进入自定义错误页面,见:org.springframework.boot.autoconfigure.web.AbstractErrorController
		req.setAttribute("javax.servlet.error.status_code", 500);
		
		//转发到springBoot错误处理请求,能适配网页和Ajax的错误处理
		//请求/error后,会进入BasicErrorController(@RequestMapping("${server.error.path:${error.path:/error}}"))
		//页面的数据显示处理是使用:errorAttributes.getErrorAttributes获取显示的,是AbstractErrorController的方法
		//当需要把自己定义的Map错误信息传递到错误提示页面时,
		//可以编写一个自定义错误属性类处理:CustomErrorAttribute,继承DefaultErrorAttributes类,
		//重写getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace)方法
		return "forward:/error";
	}
	
}

 

异常捕捉后请求转发到

return "forward:/error";

 是为了让SpringBoot底层处理,协助系统适配页面返回结果和Ajax返回结果:当是页面打开时,会跳转到相应的错误页面显示异常信息,当是Ajax请求或者使用工具请求时,返回的json字符串。(下面有图)

 

SpringBoot适配页面返回结果和Ajax返回结果的代码如下:

@RequestMapping(produces = "text/html")
	public ModelAndView errorHtml(HttpServletRequest request,
			HttpServletResponse response) {
		HttpStatus status = getStatus(request);
		Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes(
				request, isIncludeStackTrace(request, MediaType.TEXT_HTML)));
		response.setStatus(status.value());
		ModelAndView modelAndView = resolveErrorView(request, response, status, model);
		return (modelAndView == null ? new ModelAndView("error", model) : modelAndView);
	}

	@RequestMapping
	@ResponseBody
	public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
		Map<String, Object> body = getErrorAttributes(request,
				isIncludeStackTrace(request, MediaType.ALL));
		HttpStatus status = getStatus(request);
		return new ResponseEntity<Map<String, Object>>(body, status);
	}

 

 

二、自定义异常信息传递类

import java.util.Map;

import org.springframework.boot.autoconfigure.web.DefaultErrorAttributes;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;

@Component
public class CustomErrorAttribute extends DefaultErrorAttributes {
	
	public static final String CUSTOM_ERROR_MAP_NAME = "customErrorMap";

	@Override
	public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) {
		Map<String, Object> map = super.getErrorAttributes(requestAttributes, includeStackTrace);
		
		//设置传递自己定义的错误信息
		map.put(CUSTOM_ERROR_MAP_NAME, requestAttributes.getAttribute(CUSTOM_ERROR_MAP_NAME, RequestAttributes.SCOPE_REQUEST));
		return map;
	}
	
}

定义这个类,是为了传递自己想要显示的错误信息,例如在Controller发生错误时,想把某些特殊信息传到错误页面,就可以自定义一个异常信息处理类,传递自己的自定义错误信息,同时也兼容SpringBoot本身定义好的错误 信息。

 

三、页面显示异常信息

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>500</title>
</head>
<body>
	<div>500错误</div>
	<div>path:[[${path}]]</div>
	<div>status:[[${status}]]</div>
	<div>timestamp:[[${#dates.format(timestamp, 'yyyy-MM-dd HH:mm:ss')}]]</div>
	<div>error:[[${error}]]</div>
	<div>exception:[[${exception}]]</div>
	<div>message:[[${message}]]</div>
	<div>errors:[[${errors}]]</div>
	<!-- 自定义属性 -->
	<div>customErrorMap.errorMsg:[[${customErrorMap.errorMsg}]]</div>
	<div>customErrorMap.errorSystem:[[${customErrorMap.errorSystem}]]</div>
	<div>customErrorMap.errorCode:[[${customErrorMap.errorCode}]]</div>
</body>
</html>

 

页面显示结果:


 

Post请求结果:


 

项目源码见附件:SpringBoot-自定义错误.zip

 

 

==========================SpringBoot自定义错误页面见:===================================

SpringBoot自定义错误页面,SpringBoot 404、500错误提示页面

SpringBoot 4xx.html、5xx.html错误提示页面

 http://fanshuyao.iteye.com/blog/2414828

 

 (如果你觉得文章对你有帮助,欢迎捐赠,^_^,谢谢!) 


    

 

================================

©Copyright 蕃薯耀 2018年3月29日

http://fanshuyao.iteye.com/

 

  • 大小: 15.4 KB
  • 大小: 4.8 KB
1
0
分享到:
评论
1 楼 蕃薯耀 2018-03-29  
SpringBoot自定义错误信息,SpringBoot自定义异常处理类,
SpringBoot异常结果处理适配页面及Ajax请求
SpringBoot适配Ajax请求

========
蕃薯耀

相关推荐

    Springboot项目适配虚谷数据库

    Springboot项目适配虚谷数据库

    springboot适配多数据源,多类型数据库代码

    // 设置路由规则,可以根据方法名、请求URL等进行判断 routerDataSource.setDefaultTargetDataSource(mysqlDs); // 当无法匹配规则时,使用默认数据源 return routerDataSource; } ``` 6. 最后,在代码中根据...

    基于SpringBootAdmin的SpringBoot单机版监控工具前端接口适配设计源码

    本项目的主要目标是通过设计一套前端接口适配方案,使得SpringBootAdmin的前端页面能够直接访问到SpringBoot应用程序中通过Actuator暴露的内部监控信息。Actuator是SpringBoot提供的一个用于提供应用生产级别的监控...

    SpringBoot集成MyBatis-Plus实现国产数据库适配.docx

    SpringBoot 集成 MyBatis-Plus 实现国产数据库适配 MyBatis-Plus 是一款在 MyBatis 的基础上进行扩展的开源工具包,只做增强不做改变,引入 MyBatis-Plus 不会对您现有的 Mybatis 构架产生任何影响。MyBatis-Plus ...

    activiti 7 + springboot2(六) SpringBoot2 整合 Activiti7

    (一)首先 pom.xml 文件中引入相关的依赖 ...(二)springboot 的配置文件 application.yml中添加相关的配置 (三)流程资源 (四)编写Applocation主程序 (五)编写基于SpringBootTest的测试程序

    基于Springboot的健身信息系统.zip

    《基于Springboot的健身信息系统详解》 在当前数字化时代,健身信息系统的开发已经成为提升健康管理效率的重要工具。本文将深入探讨一个基于Springboot框架构建的健身信息系统,它为毕业设计、课程设计提供了丰富的...

    Android自定义Banner控件,完美适配

    自定义的banner控件,直接使用,完美适配所有场景,activity和fragment都没问题。

    springboot整合sharding-jdbc完整代码

    SpringBoot整合Sharding-JDBC是将Sharding-JDBC这一分布式数据库中间件与SpringBoot框架结合,以实现数据分片、读写分离等高级数据库管理功能。这个完整的代码示例覆盖了Sharding-JDBC的主要技术点,使开发者可以...

    springboot2.1.5集成CXF3.2.5,webservice服务端

    在IT行业中,Spring Boot和Apache CXF是两个非常重要的组件,它们在开发高效、轻量级的Web服务中发挥着...在实际开发中,还可以根据需求进一步定制CXF的行为,例如添加安全控制、错误处理等,以满足更复杂的应用场景。

    springboot mybatis gbase

    在IT行业中,SpringBoot和MyBatis是两个非常流行的开源框架,它们被广泛用于构建高效、简洁的企业级Java应用。而GBase则是南大通用数据技术有限公司推出的一种高性能的分布式数据库系统,尤其适用于大规模数据处理和...

    基于SpringBoot+uni-app实现的类似驾考宝典的答题软件,适配 H5 和 APP毕业设计

    【作品名称】:基于SpringBoot+uni-app实现的类似驾考宝典的答题软件,适配 H5 和 APP【毕业设计】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或...

    java springboot房地产信息管理系统.zip

    【标题】:“java springboot房地产信息管理系统”是一个基于Java技术和SpringBoot框架的房地产信息管理解决方案。这个系统旨在高效地管理房地产的数据,包括房源信息、客户资料、交易记录等,为房地产行业的运营...

    springboot

    基于SpringBoot的后台管理系统,mysql数据库,学习springboot的可以拿来参考。

    oracle&&mysql;多环境配置(SpringBoot)

    在开发Java Web应用程序时,尤其是使用SpringBoot框架时,经常需要处理多个数据库环境,例如Oracle和MySQL。本篇文章将深入探讨如何在SpringBoot项目中进行多环境配置,以适应不同的数据库需求,同时解决可能出现的...

    微信小程序自定义navigationBar顶部导航栏,兼容适配所有机型(附完整案例)

    根据不同机型计算出该机型的导航栏高度,进行适配 编写新的导航栏 引用到页面 正文 一、隐藏原生的navigationBar window全局配置里有个参数:navigationStyle(导航栏样式),default=默认样式,custom=自定义样式。...

    基于springboot的疫情信息管理系统源码数据库.doc

    该系统旨在利用SpringBoot框架,结合其他相关技术(如JSP、AJAX),构建一个能够有效管理疫情信息的应用程序。 #### 用户需求分析 在系统设计之初,首先进行了详尽的用户需求调研,明确了系统的几个核心功能模块:...

    springboot整合redis集群零配置

    首先,让我们来看看"Springboot整合Redis集群,零配置方式"。在Spring Boot中,我们可以通过引入`spring-boot-starter-data-redis`依赖来启用Redis支持。但是,要配置Redis集群,通常需要设置多个节点地址、密码、...

Global site tag (gtag.js) - Google Analytics