解决spring boot中rest接口404,500等错误返回统一的json格式
2018-01-28 23:48
2546 查看
在开发rest接口时,我们往往会定义统一的返回格式,列如:
但是如果调用方请求我们的api时把接口地址写错了,就会得到一个404错误,在传统的web系统中我们可自定义404错误页面,展示更友好。
在spring boot中其实也是返回了一个json格式的数据,如下:
告诉我们哪个地址是没找到,其实也挺友好的,但是因为我们上面自定义的数据格式跟下面的不一致,当用户拿到这个返回的时候是无法识别的,其中最明显的是status字段。
我们自定义的是boolean类型,表示是否成功
这边返回的就是http的状态码
所以我们需要在发生这种系统错误时也能返回我们自定义的那种格式
定义一个异常处理类
ResponseData是我们返回格式的实体类
这种在发生错误时这边会捕获到,然后封装好返回格式,返回给调用方
最后关键的一步是在spring boot的配置文件中加上如下配置:
然后我们调用一个不存在的接口时,返回的错误信息就是我们自定义的那种格式了
{ "status": true, "code": 200, "message": null, "data": [ { "id": "101", "name": "jack" }, { "id": "102", "name": "jason" } ] }
但是如果调用方请求我们的api时把接口地址写错了,就会得到一个404错误,在传统的web系统中我们可自定义404错误页面,展示更友好。
在spring boot中其实也是返回了一个json格式的数据,如下:
{ "timestamp": 1492063521109, "status": 404, "error": "Not Found", "message": "No message available", "path": "/rest11/auth" }
告诉我们哪个地址是没找到,其实也挺友好的,但是因为我们上面自定义的数据格式跟下面的不一致,当用户拿到这个返回的时候是无法识别的,其中最明显的是status字段。
我们自定义的是boolean类型,表示是否成功
这边返回的就是http的状态码
所以我们需要在发生这种系统错误时也能返回我们自定义的那种格式
定义一个异常处理类
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; 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; @ControllerAdvice public class GlobalExceptionHandler { private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); /** * 系统异常处理,比如:404,500 * @param req * @param resp * @param e * @return * @throws Exception */ @ExceptionHandler(value = Exception.class) @ResponseBody public ResponseData defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception { logger.error("", e); ResponseData r = new ResponseData(); r.setMessage(e.getMessage()); if (e instanceof org.springframework.web.servlet.NoHandlerFoundException) { r.setCode(404); } else { r.setCode(500); } r.setData(null); r.setStatus(false); return r; } }
ResponseData是我们返回格式的实体类
这种在发生错误时这边会捕获到,然后封装好返回格式,返回给调用方
最后关键的一步是在spring boot的配置文件中加上如下配置:
#出现错误时, 直接抛出异常 spring.mvc.throw-exception-if-no-handler-found=true #不要为我们工程中的资源文件建立映射 spring.resources.add-mappings=false
然后我们调用一个不存在的接口时,返回的错误信息就是我们自定义的那种格式了
{ "status": false, "code": 404, "message": "No handler found for GET /rest11/auth", "data": null }
相关文章推荐
- 解决spring boot中rest接口404,500等错误返回统一的json格式
- 异常解决篇:Spring Boot默认错误返回格式变成数组@RequestBody无法解析Json格式
- SpringBoot RestController 同时支持返回xml和json格式数据
- spring boot架构设计——权限验证及API接口统一返回格式
- Springboot使用FastJson后,接口返回中文乱码的问题解决。
- Spring MVC 全局异常处理-RESTAPI接口返回统一JSON格式-自定义异常处理--404异常捕捉
- spring boot 解决后台返回 json 到前台中文乱码之后出现返回json数据报错 500
- 利用spring rest返回json数据时,客户端返回406错误
- SpringMVC4.0实现rest风格接口,json格式请求和返回
- spring接口通过配置支持返回多种格式(xml,json,html,excel)
- .net Rest Web Api Controller 返回JSON格式大小写问题解决.
- Spring MVC Rest服务 返回json报406错误的解决办法
- springboot 返回json格式数据时间格式配置
- spring4.1 请求rest接口406问题解决(转换JSON)
- Spring Cloud Spring Boot mybatis分布式微服务云架构(十二)返回JSON格式
- dojo接收spring返回json对象错误解决
- spring boot新手教程之使用FastJson解析JSON数据以及解决返回中文乱码问题
- spring-boot统一处理返回给前台的数据格式(避免返回异常堆栈信息,干扰用户体验)
- 关于SpringBoot自定义注解(解决post接收String参数 null(前台传递json格式))
- 解决:sprng boot 项目在IDEA中spring-boot run正常运行,但是打成JAR包之后访问界面返回404