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();
    }

异常情况下需要和统一异常处理结合使用

 

posted @ 2021-08-26 16:31  meow_world  阅读(502)  评论(1)    收藏  举报