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。這是一個沒有內容的接口,應該只做標記使用,序列化的對象在遠程傳輸時可以在流與對象互相轉換。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM