前后端分离的项目开发前,会提前规定好数据返回格式,本文以JSON为例。
第一步,定义好JavaBean。
package com.yclouds.myhelper.web.response;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.yclouds.myhelper.web.error.code.BaseEnumError;
import java.io.Serializable;
import lombok.Data;
/**
* 所有服务统一响应数据格式
*
* @author ye17186
* @version 2019/2/15 14:40
*/
@Data
public class ApiResp<T> implements Serializable {
private static final long serialVersionUID = 9211889136173018364L;
/**
* 正常响应码
*/
private static final int SUCCESS_CODE = 0;
/**
* 正常响应消息
*/
private static final String SUCCESS_MSG = "SUCCESS";
/**
* 错误码
*/
private int code = SUCCESS_CODE;
/**
* 错误信息
*/
private String msg = SUCCESS_MSG;
/**
* 响应内容,默认为null
*/
private T data = null;
/**
* 是否的正常响应
*
* @return true=正常;false=异常
*/
@JsonIgnore
public boolean isOK() {
return code == SUCCESS_CODE;
}
/**
* 无data的正常返回
*/
public static ApiResp retOK() {
return new ApiResp();
}
/**
* 有data的正常返回
*
* @param data data内容
* @param <T> data类型
*/
public static <T> ApiResp<T> retOK(T data) {
ApiResp<T> response = new ApiResp<>();
response.setData(data);
return response;
}
/**
* 无data的失败返回
*
* @param error 错误类型
*/
public static ApiResp retFail(BaseEnumError error) {
return retFail(error.getCode(), error.getMsg());
}
/**
* 有data的失败返回
*
* @param error 错误类型
* @param data 详细错误信息
*/
public static <T> ApiResp<T> retFail(BaseEnumError error, T data) {
return retFail(error.getCode(), error.getMsg(), data);
}
/**
* 无data的失败返回
*
* @param code 错误码
* @param msg 错误信息
*/
public static <T> ApiResp<T> retFail(int code, String msg) {
ApiResp<T> response = new ApiResp<>();
response.setCode(code);
response.setMsg(msg);
return response;
}
/**
* 有data的失败返回
* <br>
* 失败返回的场景不多,所以没有严格要求T泛型
*
* @param code 错误码
* @param msg 错误信息
*/
public static <T> ApiResp<T> retFail(int code, String msg, T data) {
ApiResp<T> response = new ApiResp<>();
response.setCode(code);
response.setMsg(msg);
response.setData(data);
return response;
}
}
第二步,在Controller中使用
@GetMapping("/test1")
public ApiResp test1() {
return ApiResp.retOK("Hello World");
}
@GetMapping("/test2")
public ApiResp test2() {
return ApiResp.retFail(BaseEnumError.SYSTEM_NO_LOGIN);
}
可以在Postman查看具体的响应内容如下:
当然,ApiResp中的泛型,也可以使用复杂的数据对象。实际开发中,每种错误响应都有自己的响应码code,和错误信息msg,示例中统一定义了一个BaseEnumError的枚举类,具体内容可参照我的github项目https://github.com/ye17186/myhelper-spring-boot-starter