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返回异常的更多相关文章

  1. springboot自定义异常

    SpringBoot自定义异常以及异常处理 在web项目中,我们可能需要给前端返回不同的提示码.例如:401表示没有权限,500代表位置异常,200代表请求成功等.但是这些提示码远远不能满足我们返回给 ...

  2. 【快学springboot】5.全局异常捕获,异常流处理业务逻辑

    前言 上一篇文章说到,参数校验,往往需要和全局的异常拦截器来配套使用,使得返回的数据结构永远是保持一致的.参数异常springboot默认的返回结构: { "timestamp": ...

  3. 源码剖析Springboot自定义异常

    博主看到新服务是封装的自定义异常,准备入手剖析一下,自定义的异常是如何进行抓住我们请求的方法的异常,并进行封装返回到.废话不多说,先看看如何才能实现封装异常,先来一个示例: @ControllerAd ...

  4. SpringBoot 构建RestFul API 含单元测试

    相关博文: 从消费者角度评估RestFul的意义 SpringBoot 构建RestFul API 含单元测试 首先,回顾并详细说明一下在快速入门中使用的  @Controller .  @RestC ...

  5. SpringBoot系列十一:SpringBoot整合Restful架构(使用 RestTemplate 模版实现 Rest 服务调用、Swagger 集成、动态修改日志级别)

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot整合Restful架构 2.背景 Spring 与 Restful 整合才是微架构的核心,虽然在整 ...

  6. springboot之全局处理异常封装

    springboot之全局处理异常封装 简介 在项目中经常出现系统异常的情况,比如NullPointerException等等.如果默认未处理的情况下,springboot会响应默认的错误提示,这样对 ...

  7. springmvc/springboot开发restful API

    非rest的url写法: 查询 GET /user/query?name=tom 详情 GET /user/getinfo? 创建 POST /user/create?name=tom 修改 POST ...

  8. 【快学springboot】2.Restful简介,SpringBoot构建Restful接口

    Restful简介 Restful一种软件架构风格.设计风格,而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现 ...

  9. 项目部署到liunx环境下访问接口返回异常

    1.访问接口返回异常 已经连续踩了两次这个坑了.所以记下来了.方便下次搜索! 项目在window下运行正常,无任何异常! 但是部署到liunx环境下的服务器上就有问题 访问静态页面毫无问题,一旦涉及到 ...

随机推荐

  1. 编译 recastnavigation

      1. https://github.com/memononen/recastnavigation 下载zip并解压 2. 打开https://www.libsdl.org/download-2.0 ...

  2. React/数据流

    “Props” 当 React 元素为用户自定义组件时,它会将 JSX 所接收的属性(attributes)转换为单个对象传递给组件,这个对象被称之为 “props”. props的只读性 组件无论是 ...

  3. shell for 循环简单用法

    for循环:固定有限次数循环,工作中for使用最多. 语法1: for 变量名 in 变量取值列表 do 指令… done 学习方法:记住下面的内容 for 男人 in 世界 do if [ 有房 ] ...

  4. 用一个N点复序列的FFT同时计算两个N点实序列离散傅里叶变换

    一.功能 用一个\(N\)点复序列快速傅立叶变换算法来同时计算两个\(N\)点实序列的离散傅立叶变换. 二.方法简介 假设\(x(n)\)与\(y(n)\)都是长度为\(N\)的实序列,为计算其离散傅 ...

  5. HTML5 canvas 在线涂鸦

    插件地址 http://bencentra.github.io/jq-signature/ 采用技术 jq-signature.min.js Developed using jQuery 2.1.4. ...

  6. springboot系列(五) 静态资源处理

    转载:https://www.cnblogs.com/magicalSam/p/7189476.html 1.静态资源路径是指系统可以直接访问的路径,且路径下的所有文件均可被用户通过浏览器直接读取. ...

  7. AutoMapper 的简单使用

    var config = new MapperConfiguration( cfg => cfg.CreateMap<SYS_Menu, MenuTreeNode>() .ForMe ...

  8. contenteditable属性让div也可以当做输入框

    你知道div也可以当做输入框么? H5的全局属性contenteditable,带有contenteditable属性的div而不是input或者textarea来作为输入框(div可以根据内容自动调 ...

  9. HDU 6141 - I am your Father! | 2017 Multi-University Training Contest 8

    思路来自 FXXL 最小树形图模板用kuangbin的 /* HDU 6141 - I am your Father! [ 最小树形图 ] | 2017 Multi-University Traini ...

  10. Codeforces Round #442 (Div. 2) B题【一道模拟题QAQ】

    B. Nikita and string One day Nikita found the string containing letters "a" and "b&qu ...