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