springboot统一返回json数据格式并配置系统异常拦截

本文链接:https://blog.csdn.net/syystx/article/details/82870217
通常进行前后端分离开发时我们需要定义统一的json数据交互格式并对系统未处理异常进行处理。以下具体介绍在springboot中的实现过程,通过该章节代码可实现框架统一异常处理,并当后台接口反馈类型不为统一格式时能够进行重新包装成统一格式进行返回。

具体实现如下:

1、定义统一返回格式

public class RtnMsg{

private String rtnCode;

private String rtnMsg="";

private Object msg;

public RtnMsg(String rtnCode,String rtnMsg,Object msg){
this.rtnCode = rtnCode;
this.rtnMsg = rtnMsg;
this.msg = msg;
}

public RtnMsg(String rtnCode,String rtnMsg){
this.rtnCode = rtnCode;
this.rtnMsg = rtnMsg;
}

public RtnMsg(){
}

public String getRtnCode() {
return rtnCode;
}

public void setRtnCode(String rtnCode) {
this.rtnCode = rtnCode;
}

public String getRtnMsg() {
return rtnMsg;
}

public void setRtnMsg(String rtnMsg) {
this.rtnMsg = rtnMsg;
}

public Object getMsg() {
return msg;
}

public void setMsg(Object msg) {
this.msg = msg;
}

}
2、设置常用错误码

public class RtnCode {

//正常返回
public static final String STATUS_OK = "000";
//参数错误
public static final String STATUS_PARAM = "001";
//接口未发现
public static final String STATUS_NOFOUND = "404";
//捕获到异常
public static final String STATUS_SYSERROR = "500";
}
3、定义未处理异常统一拦截

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @author suntongxin
* Create on 2017年12月12日下午1:55:12
* All right reserved
*/
@ControllerAdvice
public class CommExceptionHandler {

@ResponseBody
@ExceptionHandler(value = Exception.class)
public RtnMsg handle(Exception e){
RtnMsg msg = new RtnMsg(RtnCode.STATUS_SYSERROR, "系统异常,异常原因:"+e.getMessage());
return msg;
}
4、注入拦截response的bean对象

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author suntongxin
* Create on 2017年12月12日下午1:55:27
* All right reserved
*/
@Configuration
public class RtnMsgConfig{

@Bean
public ResponseBodyWrapFactoryBean getResponseBodyWrap(){

return new ResponseBodyWrapFactoryBean();

}

}
5、设置bean过滤原则

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor;
/**
* @author suntongxin
* Create on 2017年12月12日上午10:48:43
* All right reserved
*/
public class ResponseBodyWrapFactoryBean implements InitializingBean{

@Autowired
private RequestMappingHandlerAdapter adapter;

@Override
public void afterPropertiesSet() throws Exception {

List<HandlerMethodReturnValueHandler> returnValueHandlers = adapter.getReturnValueHandlers();
List<HandlerMethodReturnValueHandler> handlers = new ArrayList(returnValueHandlers);
decorateHandlers(handlers);
adapter.setReturnValueHandlers(handlers);

}

private void decorateHandlers(List<HandlerMethodReturnValueHandler> handlers){

for(HandlerMethodReturnValueHandler handler : handlers){
if(handler instanceof RequestResponseBodyMethodProcessor){
ResponseBodyWrapHandler decorator = new ResponseBodyWrapHandler(handler);
int index = handlers.indexOf(handler);
handlers.set(index, decorator);
break;
}
}

}

}
6、实现具体的统一json返回处理

package cn.seisys.common;

import org.springframework.core.MethodParameter;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.method.support.ModelAndViewContainer;
/**
* @author suntongxin
* Create on 2017年12月12日上午10:48:54
* All right reserved
*/
public class ResponseBodyWrapHandler implements HandlerMethodReturnValueHandler{

private final HandlerMethodReturnValueHandler delegate;

public ResponseBodyWrapHandler(HandlerMethodReturnValueHandler delegate){

this.delegate = delegate;

}

@Override
public boolean supportsReturnType(MethodParameter returnType) {

return delegate.supportsReturnType(returnType);

}

@Override
public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest) throws Exception {
RtnMsg rtnMsg = null;
if(returnValue instanceof RtnMsg){
rtnMsg = (RtnMsg)returnValue;
}else{
rtnMsg = new RtnMsg(RtnCode.STATUS_OK,"",returnValue);
}

delegate.handleReturnValue(rtnMsg, returnType, mavContainer, webRequest);;

}

}
 
————————————————
版权声明:本文为CSDN博主「L若儿」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/syystx/article/details/82870217

原文地址:https://www.cnblogs.com/qq75077027/p/11517943.html

时间: 2024-11-08 16:46:59

springboot统一返回json数据格式并配置系统异常拦截的相关文章

springboot处理统一返回json数据格式

第一步,写一个实体类JsonResultEntity,定义返回的参数 package com.bujiang.magic.common.utils; public class JsonResultEntity { private Object data; private String message; private Integer code; public Object getData() { return data; } public void setData(Object data) {

SpringMVC 统一返回JSON格式数据到前端

有时在给APP做接口功能的时候,都是返回JSON格式的数据,所以最好的只好在工程设置一个统一的数据返回方式 在SpringMVC 直接配置XML可以产生这种配置,比较简单 Spring的版本我用的是4.3.3的 <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter&qu

struts2、servlet中返回json数据格式

json数据格式在现在的web开发中应用的是非常多的,基本上现在都用json在前后传数据.那么在struts和servlet中这么返回json格式呢?JSON数据在传递过程中,其实就是传递一个普通的符合JSON语法格式的字符串而已,所谓的"JSON对象"是指对这个JSON字符串解析和包装后的结果,所以我们要做的就是构造一个满足JSON格式的字符串就好了,这是原理切记切记啊,下面我已代码的方式演示几种方法. 需求:我们从前端输入用户名+密码,后端以json格式返回用户名+密码,前端ale

SpringBoot 02_返回json数据

在SpringBoot 01_HelloWorld的基础上来返回json的数据,现在前后端分离的情况下多数都是通过Json来进行交互,下面就来利用SpringBoot返回Json格式的数据. 1:新建Pesron.java @Data public class Person { //编号 private String id; // 姓名 private String name; // 性别 private String gender; } 至于@Data注解的作用,请参考Lombok教程. 2:

上手spring boot项目(四)之springboot如何返回json数据

在springboot整合thymeleaf中,经常会在HTML页面中接收来自服务器的json数据,然后处理json数据并在页面上渲染.那么如何在服务器中返回json类型的数据呢? 1.使用@ResponseBody注解 该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的 数据如:json,xml 等,通过 Response 响应给客户端 在controller的方法上增加@RespongBody @RequestMappi

springmvc 提供的统一解决json中文乱码配置

<!--springmvc 统一解决json中文乱码问题--><mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg value=&qu

WebApi关于配置全局返回Json数据格式时间以及命名小写

1.直接在Global文件中配置: 1 var formatters = GlobalConfiguration.Configuration.Formatters; 2 var jsonFormatter = formatters.JsonFormatter; 3 var settings = jsonFormatter.SerializerSettings; 4 settings.Formatting = Newtonsoft.Json.Formatting.Indented; 5 setti

WCF返回JSON的详细配置

开发环境:VS2008,c# 1.新建个WCF服务网站 文件-新建-网站-WCF服务 2,运行一下,提示配置WEB.CONFIG,点击确认. 3,打开web.config增加如下节点: <serviceHostingEnvironment aspNetCompatibilityEnabled="true">  </serviceHostingEnvironment> endpoint 中增加 behaviorConfiguration="webBeha

关于ajax请求,返回json数据格式

使用servlet测试 后台数据为:返回类型没有设置(方式一) 1 String str = "["+ 2 "{ id:1, pId:0, name:\"可折腾的父节点 1\", t:\"我很普通,随便 展开/折叠 我吧\", open:false},"+ 3 "{ id:11, pId:1, name:\"叶子节点 - 1\", t:\"我老爸很普通,随便折腾他吧\"},&q