请求响应内容统一处理

1、定义返回实体类

package com.forezp.aspect;

import lombok.Data;

import java.io.Serializable;

@Data
//@ApiModel("统一返回包装类")
public class ResponseData<T> implements Serializable{

   /**
    * 
    */
   private static final long serialVersionUID = 414285631391953056L;

   //@ApiModelProperty(value = "0-失败;1-成功",name="result", dataType = "Integer",example = "1")
   private Integer result;
   
   //@ApiModelProperty(value = "响应码",name="code", dataType = "String",example = "200")
   private String code;
   
   //@ApiModelProperty(value = "响应信息",name="msg", dataType = "String",example = "成功")
   private String msg;
   
   //@ApiModelProperty(value = "返回数据",name="data")
   private T data;
   
}

2、请求响应内容统一处理

 

package com.forezp.aspect;


import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import javax.servlet.http.HttpServletRequest;
import javax.sound.midi.Soundbank;
import java.util.HashMap;


/**
 * 请求响应内容统一处理
 *
 */
@ControllerAdvice
public class ResponseBodyUnifiedHandler implements ResponseBodyAdvice<Object> {

    //@Value("${result.except-paths}")
    //private String exceptPaths;

    //请求
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//        return true;
        String uri = request.getRequestURI();
        //不拦截swagger
        if (uri.contains("swagger")||"/v2/api-docs".contains(uri)){
            return  false;
        }
        /*String[] paths = exceptPaths.split(",");
        for (String url : paths) {
            if (uri.contains(url)) {
                return false;
            }
        }*/

        return  true;
    }

    //响应
    @Override
    public Object beforeBodyWrite(Object result, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        serverHttpResponse.getHeaders().setContentType(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE));
        if (result instanceof ResponseData) {//如果返回值ResponseData
            return result;
        }
        if (result!=null){
            //header无数据异常情况
            String ss = JSON.toJSONString(result);
            try {
                HashMap<String,Object> map = JSON.parseObject(ss, HashMap.class);
                Integer status =(Integer)map.get("status");
                if (status!=null && 500==status){
                    return ResultUtils.error("异常",result);
                }else if (status!=null && 404==status){
                    return ResultUtils.error(ResultCodeEnum.NO_HANDLER_FOUND.getCode(),"404访问错误!",result);
                }
            }catch (Exception e){
                return ResultUtils.success(result);
            }
        }
       return ResultUtils.success(result);
    }
}

 

3、常用返回code枚举

package com.forezp.aspect;

/**
 * 常用返回code枚举
 *
 */
public enum ResultCodeEnum {
    
   SUCCESS("200", "成功"),
   DATA_ERROR("600", "数据异常"),
   NO_HANDLER_FOUND("404", "404"),
   BUSINESS_ERROR("-100", "服务器错误"),
   REMOTE_INTERFACE_ERROR("700", "接口调用异常"),
   DECRYPT_ERROR("702", "解密失败"),
   ENCRYPT_ERROR("701", "加密失败"),
   UNKNOW_ERROR("500", "未知错误"),
   TMC1001("1001", "参数传递有误"),
   TMC1002("1002", "查无航班"),
   TMC1003("1003", "数据过期"),
   TMC1004("1004", "接口验价失败,该航班的没有有效价格"),
   TMC1005("1005", "接口占位失败,该航班舱位已售完"),
   TMC1006("1006", "订单状态无效,确认失败"),
   TMC1007("1007", "客人支付金额与实际订单金额不符"),
   TMC1008("1008", "当前订单状态不允许取消"),
   TMC1009("1009", "客票规定不允许改期"),
   TMC1010("1010", "客票规定不允许退票"),
   TMC1011("1011", "订单当天状态不允许"),
   TMC1012("1012", "请求条件校验不通过"),
   TMC1099("1099", "系统故障");
   
    private String code;
    private String message;

    ResultCodeEnum(String code, String message) {
        this.code = code;
        this.message = message;
    }

    public String getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

4、ResultUtils

package com.forezp.aspect;


/**
 */
public class ResultUtils {


    /**
     * 提供给部分不需要出參的接口
     *
     * @return
     */
    public static ResponseData success() {
        return success(null);
    }

    /**
     * 返回成功,传入返回体具体出參
     *
     * @param message
     * @param object
     * @return
     */
    public static <T> ResponseData success(String message, T object) {
        return generalMethod(ResultCodeEnum.SUCCESS.getCode(), message, object);
    }

    /**
     * 返回成功,传入返回体具体出參
     *
     * @param object
     * @return
     */
    public static <T> ResponseData success(T object) {
        return generalMethod(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage(), object);
    }

    /**
     * 自定义错误信息
     *
     * @param message
     * @return
     */
    public static ResponseData error( String message) {
        return generalMethod(ResultCodeEnum.BUSINESS_ERROR.getCode(), message, null);
    }

    /**
     * 自定义错误信息
     *
     * @param message
     * @return
     */
    public static <T> ResponseData error( String message, T object) {
        return generalMethod(ResultCodeEnum.BUSINESS_ERROR.getCode(), message, object);
    }

    /**
     * 自定义错误信息
     *
     * @param code
     * @param message
     * @return
     */
    public static ResponseData error(String code, String message) {
        return generalMethod(code, message, null);
    }
    
    /**
     * 自定义错误信息及回传信息
     *
     * @param code
     * @param message
     * @param object
     * @param <T>
     * @return
     */
    public static <T> ResponseData error(String code, String message, T object) {
        return generalMethod(code, message, object);
    }

    /**
     * 返回异常信息,在已知的范围内
     *
     * @param codeEnum
     * @return
     */
    public static ResponseData error(ResultCodeEnum codeEnum) {
        return generalMethod(codeEnum.getCode(), codeEnum.getMessage(), null);
    }

    /**
     * 返回异常信息,在已知的范围内
     *
     * @param codeEnum
     * @return
     */
    public static <T> ResponseData error(ResultCodeEnum codeEnum, T object) {
        return generalMethod(codeEnum.getCode(), codeEnum.getMessage(), object);
    }

    /**
     * 通用方法
     *
     * @param code
     * @param message
     * @param object
     * @param <T>
     * @return
     */
    private static <T> ResponseData generalMethod(String code, String message, T object) {
       ResponseData<T> result = new ResponseData<T>();
       result.setResult(code.equals(ResultCodeEnum.SUCCESS.getCode()) ? 1: 0);
        result.setCode(code);
        result.setMsg(message);
        result.setData(object);
        return result;
    }

}

测试

@GetMapping(value="/queryById/{id}")
public Position queryById(@PathVariable(value = "id") Integer id){
    if (id==0){
        id=null;
        AssertionUtils.isNull(id,"id不可为空!");
    }
    return new Position().selectById(id);
}

响应
 

{
  "result": 1,
  "code": "200",
  "msg": "成功",
  "data": {
    "positionId": 3,
    "positionName": "开发2",
    "positionDesc": "负责开发java项目",
    "positionStatus": 0,
    "positionOrder": 0,
    "companyId": 1,
    "orgId": 0,
    "createDate": null,
    "updateDate": null,
    "isDel": 0
  }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值