Spring boot自定义返回实体

Spring boot自定义返回实体

定义统一的数据结构能使前后端联调变得非常便捷。

这里期望返回的数据如下:

{
    "msg": "成功",
    "status": 200,
    "time": 123456,
    "body": {}
}

如果是查单条记录,则body对应该记录;如果是查分页记录,对应的body如下

{//Result
    "msg": "成功", //ResultEnum
    "status": 200, //ResultEnum
    "time": 123456,
    "body": {//ResultPage
    	"list": [],
    	"paging": { //Paging
    	"pageNum": 0,
            "pageSize": 10,
            "total": 0
    	}
    }
}

按对象层次结构拆解成ResultPagingResultPage以及包装生成Result的ResultEntry和状态ResultEnum

Result

package com.lhx.upgrade.entries.result;
import java.io.Serializable;
public class Result<T> implements Serializable{
    private String msg;
    private Integer status;
    private Long time;
    private T body;
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public Integer getStatus() {
        return status;
    }
    public void setStatus(Integer status) {
        this.status = status;
    }
    public Long getTime() {
        return time;
    }
    public void setTime(Long time) {
        this.time = time;
    }
    public T getBody() {
        return body;
    }
    public void setBody(T body) {
        this.body = body;
    }
    @Override
    public String toString() {
        return "Result [body=" + body + ", msg=" + msg + ", status=" + status + ", time=" + time + "]";
    }
}

Paging

package com.lhx.upgrade.entries.result;
import java.io.Serializable;
public class Paging implements Serializable{
    private Integer pageNum;
    private Integer pageSize;
    private Long total;
    public Paging() {}
    public Paging(Integer pageNum, Integer pageSize, Long total) {
        this.pageNum = pageNum;
        this.pageSize = pageSize;
        this.total = total;
    }
    public Integer getPageNum() {
        return pageNum;
    }
    public void setPageNum(Integer pageNum) {
        this.pageNum = pageNum;
    }
    public Integer getPageSize() {
        return pageSize;
    }
    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }
    public Long getTotal() {
        return total;
    }
    public void setTotal(Long total) {
        this.total = total;
    }
    @Override
    public String toString() {
        return "paging [pageNum=" + pageNum + ", pageSize=" + pageSize + ", total=" + total + "]";
    }
    
}

ResultPage

package com.lhx.upgrade.entries.result;

import java.io.Serializable;
import java.util.List;

import org.springframework.data.domain.Page;

public class ResultPage<T> implements Serializable{
    private List<T> list;
    private Paging paging;
    public ResultPage() {}
    public ResultPage(List<T> list, Paging paging) {
        this.list = list;
        this.paging = paging;
    }
    public ResultPage(Page<T> page) {
        this.list = page.getContent();
        this.paging = new Paging(page.getNumber(), page.getSize(), page.getTotalElements());
    }
    public List<T> getList() {
        return list;
    }
    public void setList(List<T> list) {
        this.list = list;
    }
    public Paging getPaging() {
        return paging;
    }
    public void setPaging(Paging paging) {
        this.paging = paging;
    }
    @Override
    public String toString() {
        return "ResultPage [list=" + list + ", paging=" + paging + "]";
    }   
}

ResultEnum

package com.lhx.upgrade.entries.result;

public enum ResultEnum {
    UNKNOWN_ERROR(500,"未知错误"),
    SUCCESS(200,"成功"),
    USER_NOT_EXIST(401,"用户不存在");

    private Integer status;
    private String msg;
 
    ResultEnum(Integer status, String msg) {
        this.status = status;
        this.msg = msg;
    }
 
    public Integer getStatus() {
        return status;
    }
 
    public String getMsg() {
        return msg;
    }
}

ResultEntry

package com.lhx.upgrade.entries.result;
import java.io.Serializable;

public class ResultEntry<T> implements Serializable{
    public static <T> Result<T> success(T o) {
        Result<T> result = new Result<T>();
        result.setMsg(ResultEnum.SUCCESS.getMsg());
        result.setStatus(ResultEnum.SUCCESS.getStatus());
        result.setBody(o);
        return result;
    }
    public static <T> Result<T> success() {
        Result<T> result = new Result<T>();
        result.setMsg(ResultEnum.SUCCESS.getMsg());
        result.setStatus(ResultEnum.SUCCESS.getStatus());
        return result;
    }
    public static <T> Result<T> response(ResultEnum enu, T o) {
        Result<T> result = new Result<T>();
        result.setMsg(enu.getMsg());
        result.setStatus(enu.getStatus());
        result.setBody(o);
        return result;
    }
    public static <T> Result<T> response(ResultEnum enu) {
        Result<T> result = new Result<T>();
        result.setMsg(enu.getMsg());
        result.setStatus(enu.getStatus());
        return result;
    }
}

JPA接口案例

//controller
@RequestMapping(value = "upgrade/records", method = RequestMethod.GET)
public Result<ResultPage<UpgradeRecordDTO>> getUpgradeRecords() {
    ResultPage<UpgradeRecordDTO> data = upgradeService.getUpgradeRecords();
    return ResultEntry.success(data);
}
//service
public ResultPage<UpgradeRecordDTO> getUpgradeRecords() {
    Pageable pageable = PageRequest.of(0, 10);
    return new ResultPage<>(recordRepository.findAll(pageable));
}
//dao
@Repository()
public interface UpgradeRecordRepository extends JpaRepository<UpgradeRecordDTO, Integer>{
 
}

附录:

问题1:API分页数据返回给前端时报错。com.lhx.upgrade.entries.result.Paging

`Failed on call to `getDeclaredMethods()` on class `com.lhx.upgrade.entries.result.Paging`, problem: (java.lang.NoClassDefFoundError) Lone (through reference chain: com.lhx.upgrade.entries.result.Result["body"]->com.lhx.upgrade.entries.result.ResultPage["paging"])`

原因:实体未实现java.io.Serializable。这是一个没有内容的接口,应该只做标记使用,序列化的对象在远程传输时可以在流与对象互相转换。

posted @ 2021-12-28 16:14  乐小天  阅读(950)  评论(0编辑  收藏  举报