springboot自定义异常RESTful返回异常
1.自定义异常类
package com.zhx.common.exception; import com.zhx.common.model.ErrorCode; /**
* @Author: SimonHu
* @Date: 2019/8/23 13:59
* @Description:i自定义异常
*/
public class CustomException extends RuntimeException {
private String code; /**
* @return
* @Description:无参构造函数
* @Author:SimonHu
* @Date: 2019/8/23 14:00
*/
public CustomException() {
super();
} /**
* @param message
* @return
* @Description:用详细信息指定一个异常
* @Author:SimonHu
* @Date: 2019/8/23 14:00
*/
public CustomException(String message) {
super(message);
this.code = ErrorCode.ACCESS_ERROR.getCode();
} public CustomException(String code, String message) {
super(message);
this.code = code;
} /**
* @param message
* @param cause
* @return
* @Description:用指定的详细信息和原因构造一个新的异常
* @Author:SimonHu
* @Date: 2019/8/23 14:01
*/
public CustomException(String message, Throwable cause) {
super(message, cause);
} /**
* @param cause
* @return
* @Description:用指定原因构造一个新的异常
* @Author:SimonHu
* @Date: 2019/8/23 14:01
*/
public CustomException(Throwable cause) {
super(cause);
} public String getCode() {
return code;
} public void setCode(String code) {
this.code = code;
}
}
2.枚举错误码
package com.zhx.common.model; /**
* @Author: SimonHu
* @Date: 2019/8/21 15:47
* @Description:
*/
public enum ErrorCode {
ACCESS_ERROR("403", "访问被禁止"),
BRADN_GOODS_INFO_ERROR("209", "查询不到品牌对应产品信息"),
DECIPHER_FAIL("208", "解密失败"),
BUSSINESSTYPE_NULL("207", "bussinessType不能为空"),
REQUEST_ID_NULL("206", "requestId不能为空"),
REQUEST_DOUBLE("205", "提交请求重复"),
REQUEST_FAIL("204", "查询信息失败"),
SIGN_ERROR("203", "签名错误"),
PARAM_NOT_FULL("202", "请求参数不全"),
SYS_ERROR("500", "系统错误"); ErrorCode(String code, String msg) {
this.code = code;
this.msg = msg;
} public static String getCodeInfo(String code) {
for (ErrorCode info : ErrorCode.values()) {
if (code.equals(info.getCode())) {
return info.getMsg();
}
}
return "其他错误";
} private String code;
private String msg; @Override
public String toString() {
return "ErrorCodeEnum{" +
"code=" + code +
", msg='" + msg + '\'' +
'}';
} public String getCode() {
return code;
} public void setCode(String code) {
this.code = code;
} public String getMsg() {
return msg;
} public void setMsg(String msg) {
this.msg = msg;
} public static void main(String[] args) {
System.out.println(ErrorCode.REQUEST_FAIL.getCode());
System.out.println(ErrorCode.REQUEST_FAIL.getMsg());
}
}
3.全局异常捕获类
package com.zhx.common.config; import com.zhx.common.exception.CustomException;
import com.zhx.common.model.ErrorCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; /**
* @Author: SimonHu
* @Date: 2019/8/21 10:17
* @Description:全局异常捕获
*/
@ControllerAdvice
public class GlobalExceptionHandler {
private Logger logger = LoggerFactory.getLogger(getClass().getName()); @ExceptionHandler(value = Exception.class)
@ResponseBody
public Result jsonHandler(HttpServletRequest request, Exception e) throws Exception {
if ("org.apache.catalina.connector.ClientAbortException".equals(e.getClass().getName())) {
logger.error("发生clientAbortException");
return null;
}
logger.error("-----------jsonHandler---错误信息----------:", e);
return Result.error(ErrorCode.SYS_ERROR.getCode(),e.getMessage(), "");
} /**
* @param request
* @param e
* @return com.zhx.common.Result
* @Description:i自定义异常
* @Author:SimonHu
* @Date: 2019/8/23 14:26
*/
@ExceptionHandler(value = CustomException.class)
@ResponseBody
public Result customException(HttpServletRequest request, CustomException e) {
logger.error("---------customException-----错误信息----------:"+e.getMessage());
logger.error(getErrrorInfo(e,e.getCode(),e.getMessage(),2));
return Result.error(e.getCode(), e.getMessage(), "");
} /**
* @param ex
* @param row 控制打印行数
* @return java.lang.String
* @Description:获取错误信息并记录日志
* @Author:SimonHu
* @Date: 2019/8/26 16:04
*/
private String getErrrorInfo(Exception ex, String code, String msg,int row) {
StringBuilder sb = new StringBuilder();
StackTraceElement[] error = ex.getStackTrace();
int i = 0;
for (StackTraceElement stackTraceElement : error) {
sb.append(stackTraceElement);
sb.append("\r\n");
i++;
if (i >= row) {
break;
}
}
return sb.toString();
}
}
4.针对404和500错误信息我们需要添加两个配置:
#spring配置
spring:
mvc:
#出现错误时, 直接抛出异常
throw-exception-if-no-handler-found: true
resources:
#不要为我们工程中的资源文件建立映射
add-mappings: false


这样错误信息会以json格式返回,result我统一返回的500,实际这是个404错误。
5.抛出自定义异常信息
private String getEcardsGoodsIdByFacePrice(String brandId) {
Map configMap = commonService.selectGateWayGoodsId(brandId);
if(null==configMap||configMap.isEmpty()){
throw new CustomException(ErrorCode.BRADN_GOODS_INFO_ERROR.getCode(),brandId+ErrorCode.BRADN_GOODS_INFO_ERROR.getMsg());
}
String str = String.valueOf(configMap.get("gateway_goods_id"));
return str;
}
springboot自定义异常RESTful返回异常的更多相关文章
- springboot自定义异常
SpringBoot自定义异常以及异常处理 在web项目中,我们可能需要给前端返回不同的提示码.例如:401表示没有权限,500代表位置异常,200代表请求成功等.但是这些提示码远远不能满足我们返回给 ...
- 【快学springboot】5.全局异常捕获,异常流处理业务逻辑
前言 上一篇文章说到,参数校验,往往需要和全局的异常拦截器来配套使用,使得返回的数据结构永远是保持一致的.参数异常springboot默认的返回结构: { "timestamp": ...
- 源码剖析Springboot自定义异常
博主看到新服务是封装的自定义异常,准备入手剖析一下,自定义的异常是如何进行抓住我们请求的方法的异常,并进行封装返回到.废话不多说,先看看如何才能实现封装异常,先来一个示例: @ControllerAd ...
- SpringBoot 构建RestFul API 含单元测试
相关博文: 从消费者角度评估RestFul的意义 SpringBoot 构建RestFul API 含单元测试 首先,回顾并详细说明一下在快速入门中使用的 @Controller . @RestC ...
- SpringBoot系列十一:SpringBoot整合Restful架构(使用 RestTemplate 模版实现 Rest 服务调用、Swagger 集成、动态修改日志级别)
声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot整合Restful架构 2.背景 Spring 与 Restful 整合才是微架构的核心,虽然在整 ...
- springboot之全局处理异常封装
springboot之全局处理异常封装 简介 在项目中经常出现系统异常的情况,比如NullPointerException等等.如果默认未处理的情况下,springboot会响应默认的错误提示,这样对 ...
- springmvc/springboot开发restful API
非rest的url写法: 查询 GET /user/query?name=tom 详情 GET /user/getinfo? 创建 POST /user/create?name=tom 修改 POST ...
- 【快学springboot】2.Restful简介,SpringBoot构建Restful接口
Restful简介 Restful一种软件架构风格.设计风格,而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现 ...
- 项目部署到liunx环境下访问接口返回异常
1.访问接口返回异常 已经连续踩了两次这个坑了.所以记下来了.方便下次搜索! 项目在window下运行正常,无任何异常! 但是部署到liunx环境下的服务器上就有问题 访问静态页面毫无问题,一旦涉及到 ...
随机推荐
- javaWeb文件上传与下载
文件上传与下载在项目中运用的使用频率很大 今天也花时间整理了一下 多文件上传图片回显 和文件下载 1.多文件上传 这里会涉及到几个属性 fileSizeThreshold:缓冲区文件的大小 如果上传 ...
- Computer Vision_33_SIFT:Object recognition from local scale-invariant features——1999
此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...
- DAY2新手选品原则及供应商选择
一.新手选品原则(主要是为了起量) 1.净利润率高(容易起量) 2.发货方便,售后方便(发货,打包方便,不易破损,退货率低) 3.具有细分市场优势(衣服->古代衣服,论文排版) 4.市场规模够大 ...
- ES extended_stats 函数
在进行ES聚合分析的时候,发现了一个非常有用的函数,extended_stats,可以对聚合的结果进行更近一步的分析 ,常见的 count sum avg min max 等都可以一目了然 GET ...
- linux设置自动同步服务器时间
最近遇到一个问题,由于两台服务器时间的问题,经常导致用户登录由于时间差问题而报错,再三百度,最后整理了一下修改linux定时同步的操作(本方法适用于有自己时间服务器,没有的只限于借鉴) 首先确认,我们 ...
- [GDOI2014]采集资源
题目概述 题目描述 魔兽争霸3中,战略资源的采集通过使用农民.苦工.小精灵以及寺僧来进行. 在魔兽争霸4的开发中,玻璃渣觉得这种模式太过单一,于是他们想添加更多的单位来使采集的模式更加丰富. 在新的模 ...
- ndk学习之C语言基础复习----虚拟内存布局与malloc申请
在这一次中来学习一下C语言的内存布局,了解它之后就可以解释为啥在用malloc()申请的内存之后需要用memset()来对内存进行一下初始化了,首先来了解一下物理内存与虚拟内存: 物理内存:通过物理内 ...
- bloomberg bulkFile解析
文章导航 bloomberg bulkfile解析 bloomberg bulkfile 在oracle的存储 准备工作: Bloomberg 提供了以下文件 1 . fields.csv 下载地址: ...
- post和get的在测试眼里的区别大概就是post比get安全吧……
get将请求数据放在url中,而post将请求数据放在request body中 http://www.cnblogs.com/logsharing/p/8448446.html
- JavaScript基础习题
1.实现输入框的双向绑定 解析:所谓双向绑定,即view->model, model->view,可以考虑对象劫持,监听对象属性的变化 <input type="input ...