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
}
}
}
按對象層次結構拆解成Result
、Paging
、ResultPage
以及包裝生成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
。這是一個沒有內容的接口,應該只做標記使用,序列化的對象在遠程傳輸時可以在流與對象互相轉換。