springboot 统一返回实体
我们项目中采用错误码和统一返回实体返回到前端,错误码定义参考阿里java规范。
- 1.错误码定义
- 2.错误码加载到内存
- 3.统一实体定义
- 4.使用demo
-
错误码定义
错误码定义文件 resources/error_message.properties
#错误码定义参考阿里开发规范附件,可以自定义顺序追加 #统一的成功 code-message 00000 = SUCCESS #统一的失败 code-message 99999 = ERROR # 一级 用户端错误 A0001 = 用户端错误 # 二级 用户注册错误 A0100 = 用户注册错误 A0101 = 用户未同意隐私协议 A0102 = 注册国家或地区受限 A0110 = 用户名校验失败
-
错误码加载到内存
import com.aicloud.common.core.util.ErrorHelper; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Configuration; import javax.annotation.PostConstruct; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.Properties; @Slf4j @Configuration public class ErrorMessageConfig { @PostConstruct private void loadMessage() { Properties properties = new Properties(); InputStreamReader inputStreamReader; InputStream in; try { in = this.getClass().getClassLoader().getResourceAsStream("error_message.properties"); inputStreamReader = new InputStreamReader(in, StandardCharsets.UTF_8); properties.load(inputStreamReader); properties.forEach((key, value) -> { ErrorHelper.ERROR_MAP.put((String) key, (String) value); }); } catch (IOException e) { log.error("load error properties error", e); } } }
public class ErrorHelper { /** classpath: error_message.properties */ public static HashMap<String,String> ERROR_MAP = new HashMap<>(); /** * @desc: 根据错误码获取错误信息 * @param errorCode 错误码 * @return 错误信息 */ public static String getMessage(String errorCode){ return ERROR_MAP.getOrDefault(errorCode,ERROR_MAP.get("99999")); } }
-
统一实体定义
import com.aicloud.common.core.constant.Constant; import com.aicloud.common.core.util.ErrorHelper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.github.pagehelper.PageInfo; import org.apache.commons.lang3.builder.ReflectionToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import java.io.Serializable; import java.util.List; public class Result<T> implements Serializable { private static final long serialVersionUID = -8373949364192372417L; private String code; private String message; private T data; private Page page; private String traceId; /** * -----------success method----------- */ public static <T> Result<T> ok() { return ok(Constant.OK_CODE, null, Constant.DEFAULT_SUCCESS_MESSAGE); } public static <T> Result<T> ok(T data) { return ok(Constant.OK_CODE, data, Constant.DEFAULT_SUCCESS_MESSAGE); } public static <T> Result<T> ok(String code, String message) { return ok(code, null, message); } public static <T> Result<T> ok(String code, T data, String message) { return new Result<T>().setCode(code).setData(data).setMessage(message); } public Result<T> message(String message) { this.message = message; return this; } /** * -----------error method----------- */ public static <T> Result<T> error() { return error(Constant.ERROR_CODE, Constant.DEFAULT_ERROR_MESSAGE); } /** * 根据error property的配置返回result * * @param errorCode * @param <T> * @return */ public static <T> Result<T> error(String errorCode) { String errorMessage = ErrorHelper.ERROR_MAP.getOrDefault(errorCode, Constant.DEFAULT_ERROR_MESSAGE); return error(errorCode, errorMessage); } public static <T> Result<T> error(String errorCode, String message) { return new Result<T>().setCode(errorCode).setMessage(message); } /**-----------page method-----------*/ /** * 分页数据 * * @param pageInfo {@linkplain PageInfo} * @deprecated 建议使用ipage {@link #ipage(PageInfo<T>) ipage}方法 */ @SuppressWarnings("unchecked") public static <T> Result<T> page(PageInfo<T> pageInfo) { Result<T> result = new Result<>(); result.setCode(Constant.OK_CODE); result.setMessage(Constant.DEFAULT_SUCCESS_MESSAGE); result.page = new Page(); result.page.setTotal(pageInfo.getTotal()); result.page.setPages(pageInfo.getPages()); result.page.setPageNum(pageInfo.getPageNum()); result.page.setPageSize(pageInfo.getPageSize()); result.data = (T) pageInfo.getList(); return result; } /** * 分页数据 * * @param pageInfo {@linkplain PageInfo} */ @SuppressWarnings("unchecked") public static <T> Result<List<T>> ipage(PageInfo<T> pageInfo) { Result<T> result = new Result<>(); result.setCode(Constant.OK_CODE); result.setMessage(Constant.DEFAULT_SUCCESS_MESSAGE); result.page = new Page(); result.page.setTotal(pageInfo.getTotal()); result.page.setPages(pageInfo.getPages()); result.page.setPageNum(pageInfo.getPageNum()); result.page.setPageSize(pageInfo.getPageSize()); result.data = (T) pageInfo.getList(); return (Result<List<T>>) result; } /** * mybatis IPage 转换 * * @param iPage * @param <T> * @return * @deprecated 建议使用ipage {@link #ipage(IPage<T>) ipage}方法 */ public static <T> Result<T> page(IPage<T> iPage) { Result<T> result = new Result<>(); result.setCode(Constant.OK_CODE); result.setMessage(Constant.DEFAULT_SUCCESS_MESSAGE); result.page = new Page(); result.page.setTotal(iPage.getTotal()); result.page.setPages((int) iPage.getPages()); result.page.setPageNum((int) iPage.getCurrent()); result.page.setPageSize((int) iPage.getSize()); result.data = (T) iPage.getRecords(); return result; } /** * mybatis IPage 转换 * * @param iPage * @param <T> * @return */ public static <T> Result<List<T>> ipage(IPage<T> iPage) { Result<T> result = new Result<>(); result.setCode(Constant.OK_CODE); result.setMessage(Constant.DEFAULT_SUCCESS_MESSAGE); result.page = new Page(); result.page.setTotal(iPage.getTotal()); result.page.setPages((int) iPage.getPages()); result.page.setPageNum((int) iPage.getCurrent()); result.page.setPageSize((int) iPage.getSize()); result.data = (T) iPage.getRecords(); return (Result<List<T>>) result; } /** * -----------调用是否成功------------------------ */ public boolean pigeon() { return this.code.equals(Constant.OK_CODE); } /** * -----------get/set/toString method----------- */ public String getCode() { return code; } public String getMessage() { return message; } public T getData() { return data; } public Page getPage() { return page; } public Result<T> setCode(String code) { this.code = code; return this; } public Result<T> setMessage(String message) { this.message = message; return this; } public Result<T> setData(T data) { this.data = data; return this; } public Result<T> setPage(Page page) { this.page = page; return this; } public void setTraceId(String traceId) { this.traceId = traceId; } public String getTraceId() { return traceId; } @Override public String toString() { return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE); } }
4.使用demo
1.正常返回
@GetMapping(value = "/details") public Result<AccountVO> details() { Long aicloudId = AuthUtils.getUserId(); AccountVO accountVO = accountService.details(aicloudId); return Result.ok(accountVO); }
2.异常返回
@GetMapping("/word/replace/bind")
public Result bindReplace(@RequestParam("replace") String replace) {
if (REPLACE_SET.contains(replace)) {
throw new ServiceException("A0400", "替换词非法");
}
String userId = AuthUtils.getUserId();return Result.ok();
}
异常情况下需要和统一异常处理结合使用
touch fish

浙公网安备 33010602011771号