• 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

  • 相关阅读:
    6-查看centos中的用户和用户组
    23-python用BeautifulSoup用抓取a标签内所有数据
    22-python爬虫解决gbk乱码问题
    21-py3 发邮件
    20-调用百度AI的文字识别
    6-Ubuntu与Windows不能相互复制
    2018.4.18 Ubuntu 的telnet命令详解
    2018.4.17 java多线程练习二模拟开场仪式进场
    2018.4.16 Java多线程实现龟兔赛跑
    2018.4.15 Mac系统下如何使用StartUml画好需求分析的类图 (同样适用于windows)
  • 原文地址:https://www.cnblogs.com/qq75077027/p/11517943.html
Copyright © 2020-2023  润新知