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环境下的服务器上就有问题 访问静态页面毫无问题,一旦涉及到 ...
随机推荐
- mysql-8.0.16-winx64的最新安装教程
最近刚学习数据库,首先是了解数据库是什么,数据库.数据表的基本操作,这就面临了一个问题,mysql的安装,我这里下载的是64位的,基于Windows的,以下是在我电脑上的安装过程,希望可以帮助到大家. ...
- Struts标签<s:if>判断字符串是否包含一个固定的值
Struts标签<s:if>判断字符串是否包含一个固定的值:1.如果比较对象是字符串: <s:if test="str.contains('判断是否包含的字符串')&quo ...
- vue html属性绑定
业务场景: element ui里面select的组件,通过勾选是否启动搜索功能 解决: 在select组件上绑定一个 :filterable,值就是是否可搜索的checkbox的值 true和fa ...
- 字符串slice、substring、substr
1.slice() 可以为负数,如果起始位置为负数,则从字符串最后一位向前找对应位数并且向后取结束位置,如果为正整数则从前往后取起始位置到结束位置. 2.substring() 只能非负整数,截取起始 ...
- Java 之 Map 接口
一.Map 接口概述 java.util.Map 接口专门用来存放键值对这种对象关系的对象. 下面比较一下 Collection 与 Map 的区别: Collection 中的集合,元素是孤立存在的 ...
- # marshalsec使用
开启rmi服务,恶意类放到服务上 D:\jdk_1.8\bin\java.exe -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRe ...
- iOS分类(category),类扩展(extension)—史上最全攻略
背景: 在大型项目,企业级开发中多人同时维护同一个类,此时程序员A因为某项需求只想给当前类currentClass添加一个方法newMethod,那该怎么办呢? 最简单粗暴的方式是把newMethod ...
- Flutter-现有iOS工程引入Flutter
前言 Flutter 是一个很有潜力的框架,但是目前使用Flutter的APP并不算很多,相关资料并不丰富,介绍现有工程引入Flutter的相关文章也比较少.项目从零开始,引入Flutter操作比较简 ...
- 08_Azkaban案例实践1_Command单一job示例
1.Azkaban实战 Azkaba内置的任务类型支持command.java 2.Command类型单一job示例 1.创建job描述文件:vi command.job #command.job t ...
- idou老师教你学Istio 14:如何用K8S对Istio Service进行流量健康检查
Istio利用k8s的探针对service进行流量健康检查,有两种探针可供选择,分别是liveness和readiness: liveness探针用来侦测什么时候需要重启容器.比如说当liveness ...