請求響應內容統一處理

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
  }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章