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