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环境下的服务器上就有问题 访问静态页面毫无问题,一旦涉及到 ...
随机推荐
- jQuery异步请求ajax()之complete参数详解
请求完成后回调函数 (请求success 和 error之后均调用).这个回调函数得到2个参数:XMLHTTPRequest) 对象和一个描述请求状态的字符串("success", ...
- Image Processing and Analysis_15_Image Registration:HAIRIS: A Method for Automatic Image Registration Through Histogram-Based Image Segmentation——2011
此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...
- hibernate使用注解生成表,有时无法生成数据表的原因
待生成表中有字段“desc”或“descripe”等和hibernate关键字,导致和hibernate冲突
- 云服务器搭建Jupyter-主要部分为配置服务器安全组
最近在腾讯上租了一个服务器,在CSDN上看到了一个在服务器上搭建Jupyter的帖子,就跟着介绍做了一下. 参考CSDN帖子链接:https://blog.csdn.net/ds19991999/ar ...
- ndk学习之c++语言基础复习----C++容器、类型转换、异常与文件流操作
继续来复习C++,比较枯燥,但是这是扎实掌握NDK开发的必经之路,不容小觑. 容器: 容器,就是用来存放东西的盒子. 常用的数据结构包括:数组array, 链表list, 树tree, 栈stack, ...
- Cairo
Cairo 英[ˈkaɪrəʊ] 美[ˈkaɪroʊ] n. 开罗(埃及首都); [例句]From Cairo came expressions of regret at the attac
- spring实例化三:CglibSubclassingInstantiationStrategy
在SimpleInstantiationStrategy类中,留下了包含MethodOverride对象的bd对象定义未做实现,做了抽象.CglibSubclassingInstanti ...
- Oracle不足补零函数
,') from dual ,') from dual ,') from dual ,') from dual ,') from dual
- [2019牛客多校第三场][G. Removing Stones]
题目链接:https://ac.nowcoder.com/acm/contest/883/G 题目大意:有\(n\)堆石头,每堆有\(a_i\)个,每次可以选其中两堆非零的石堆,各取走一个石子,当所有 ...
- BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)
前言 刚开始看着两道题感觉头皮发麻,后来看看题解,发现挺好理解,只是代码有点长. BZOJ 3672[NOI2014]购票 中文题面,题意略: BZOJ 3672[NOI2014]购票 设f(i)f( ...