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环境下的服务器上就有问题 访问静态页面毫无问题,一旦涉及到 ...
随机推荐
- 实现Bootstrap表格拖拽
实现Bootstrap表格拖拽: 需要引入jquery.min.js.bootstrap相关文件,以及jquery.dragsort-0.5.2.js 代码如下: <html> <h ...
- ElementUi使用表单验证出现验证问题
问题: 使用vue element-ui中的form表单验证出现了输入框或者下拉框中明明有值, 但是却还是提示请输入或请选择,错误如下: <el-form status-icon :ref=&q ...
- SpringBoot mysql出现The server time zone value '�й���ʱ��' is unrecogni
MySql :8.0.18 引入的mysql驱动: SpringBoot整合Mybatis的框架,在访问Controller的时候 : ava.sql.SQLException: The server ...
- 第三章、vue-项目前端 - vue配置 | axios配置 | cookies配置 | element-ui配置 | bootstrap配置
目录 vue项目创建 环境 创建项目 重构项目目录 文件修订:目录中非配置文件的多余文件可以移除 全局配置:全局样式.配置文件 axios前后台交互 cookies操作 element-ui页面组件框 ...
- nginx搭建反向代理服务器详解
一.反向代理:Web服务器的“经纪人” 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从 ...
- window下redis的安装和使用
1.下载及安装redis 下载地址:https://github.com/dmajkic/redis/downloads 找到对应的版本下载安装 打开cmd窗口,用cd命令进入到安装redis的根目录 ...
- 【Day5】2.反爬策略之代理IP
import urllib.request as ur proxy_address = ur.urlopen('http://api.ip.data5u.com/dynamic/get.html?or ...
- javascript 给事件任务一个缓冲区
在编写前端的过程中,经常会监听事件并执行任务,我在这抛出2个比较常见的场景: 1.输入关键字搜索如果你监听input的chage事件,会有一个问题,在使用中文输入法时,你输入的几个拼音字母都会被触发我 ...
- NUC970 Linux CAN 驱动问题及解决办法之一
开发平台介绍: NUC970 + 内置CAN控制器(双通道CAN1\CAN2) + 官方Linux_Kernel(少量修改) 名词: 版本A,问题及修改涉及两个版本,其中最旧版本称为版本A 版本B,问 ...
- 连接mongodb服务器
连接mongodb有几种方法 一种是使用mongodb编译时生成的客户端进行连接,就是我们之前介绍过的mongo客户端 另一种是使用各种驱动进行连接 这次使用mongo客户端进行连接,之前我们启动了一 ...