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

 更新时间:2024年08月09日 10:26:48   作者:L若儿  
这篇文章主要介绍了springboot统一返回json数据格式并配置系统异常拦截方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

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

通常进行前后端分离开发时我们需要定义统一的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);;
		
		
	}

}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java 照片对比功能的实现

    Java 照片对比功能的实现

    这篇文章主要介绍了Java 照片比对功能实现类的示例代码,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-12-12
  • SpringBoot使用flyway初始化数据库

    SpringBoot使用flyway初始化数据库

    这篇文章主要介绍了SpringBoot如何使用flyway初始化数据库,帮助大家更好的理解和学习使用SpringBoot框架,感兴趣的朋友可以了解下
    2021-03-03
  • java学习之一维数组中重复元素的去除

    java学习之一维数组中重复元素的去除

    关于一维数组中有重复的元素该怎么剔除,作为java初学者的我整理出不调用任何特殊库的基础方法,这种思想在其他语言也适用,有需要的朋友可以借鉴参考下
    2021-09-09
  • Java 通过JDBC连接Mysql数据库

    Java 通过JDBC连接Mysql数据库

    本文给大家详细介绍了java如何使用JDBC连接Mysql的方法以及驱动包的安装,最后给大家附上了java通过JDBC连接其他各种数据库的方法,有需要的小伙伴可以参考下。
    2015-11-11
  • idea编译时不提示任何错误信息的问题及解决

    idea编译时不提示任何错误信息的问题及解决

    这篇文章主要介绍了idea编译时不提示任何错误信息的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 快速理解Java垃圾回收和jvm中的stw

    快速理解Java垃圾回收和jvm中的stw

    这篇文章主要介绍了快速理解Java垃圾回收和jvm中的stw,涉及Java代码的停顿,jvm中的线程等相关内容,还是十分不错的,需要的朋友可以参考。
    2017-10-10
  • 剑指Offer之Java算法习题精讲链表与二叉树专项训练

    剑指Offer之Java算法习题精讲链表与二叉树专项训练

    跟着思路走,之后从简单题入手,反复去看,做过之后可能会忘记,之后再做一次,记不住就反复做,反复寻求思路和规律,慢慢积累就会发现质的变化
    2022-03-03
  • Spring Bean属性注入的两种方式详解

    Spring Bean属性注入的两种方式详解

    Spring 属性注入(DI依赖注入)有两种方式:setter注入,构造器注入。本文将详细为大家介绍一下这两种方式的具体用法,感兴趣的可以了解一下
    2022-06-06
  • Spring使用@Autowired注解实现自动装配方式

    Spring使用@Autowired注解实现自动装配方式

    这篇文章主要介绍了Spring使用@Autowired注解实现自动装配方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java源码解析ConcurrentHashMap的初始化

    Java源码解析ConcurrentHashMap的初始化

    今天小编就为大家分享一篇关于Java源码解析ConcurrentHashMap的初始化,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01

最新评论