Fork me on GitHub

还在使用ResponseEntity?试试自己构建一个优雅的响应返回类和通用分页结果类

直接上代码

1. 通用响应实体类

import java.util.Objects; /** * <p> 响应实体类 </p> * * @author lishaohui * @since 2023/9/20 19:58 */ public class Response<T> { /** * 返回结果状态码 */ private Integer code; /** * 返回结果状态信息 */ private String message; /** * 返回主体数据 */ private T data; protected Response() { } protected Response(Integer code, String message, T data) { this.code = code; this.message = message; this.data = data; } /** * 构造通用成功返回{@link Result Response}工厂方法 * * @return {@link Result Response} */ public static <T> Response<T> ok() { return Response.ok(null); } /** * 构造通用成功返回{@link Response Response}工厂方法 * * @return {@link Response Response} */ public static <T> Response<T> ok(T data) { return Response.of(BaseResponseStatus.SUCCESS_CODE, BaseResponseStatus.SUCCESS_MESSAGE, data); } /** * 构造通用失败返回{@link Result Response}工厂方法 * * @return {@link Result Response} */ public static <T> Response<T> error() { return Response.error(null); } /** * 构造通用失败返回{@link Result Result}工厂方法 * * @param message 返回消息 * @return {@link Result Result} */ public static <T> Response<T> error(String message) { return Response.of(BaseResponseStatus.ERROR_CODE, message); } /** * 构造通用失败返回{@link Result Result}工厂方法 * * @param code 返回状态码 * @param message 返回消息 * @return {@link Result Result} */ public static <T> Response<T> error(Integer code, String message) { return Response.of(code, message); } /** * 构造{@link Response Response}工厂方法 * * @param code 自定义返回码 * @param message 自定义返回消息 * @return {@link Response Response} */ public static <T> Response<T> of(Integer code, String message) { return Response.<T>builder() .code(code) .message(message) .data(null) .build(); } /** * 构造{@link Response Response}工厂方法 * * @param code 自定义返回码 * @param message 自定义返回消息 * @param data 返回数据 * @return {@link Response Response} */ public static <T> Response<T> of(int code, String message, T data) { return Response.<T>builder() .code(code) .message(message) .data(data) .build(); } /** * 构造{@link Response Response}工厂方法 * * @param status 自定义返回格式 * @param data 返回数据 * @return {@link Response Response} */ public static <T> Response<T> of(BaseResponseStatus status, T data) { return Response.<T>builder() .code(status.getCode()) .message(status.getMessage()) .data(data) .build(); } public Response(Builder<T> tBuilder) { this.code = tBuilder.code; this.message = tBuilder.message; this.data = tBuilder.data; } public static <T> Builder<T> builder() { return new Builder<>(); } public static <T> Builder<T> builder(Response<T> response) { Builder<T> builder = new Builder<>(); builder.code = response.code; builder.message = response.message; builder.data = response.data; return builder; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public T getData() { return data; } public void setData(T data) { this.data = data; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Response<?> response = (Response<?>) o; return Objects.equals(getCode(), response.getCode()) && Objects.equals(getMessage(), response.getMessage()) && Objects.equals(getData(), response.getData()); } @Override public int hashCode() { return Objects.hash(getCode(), getMessage(), getData()); } @Override public String toString() { return "Response{" + "code=" + code + ", message='" + message + '\'' + ", data=" + data + '}'; } public static class Builder<T> { private Integer code; private String message; private T data; private Builder() { } public Builder<T> code(Integer code) { this.code = code; return this; } public Builder<T> message(String message) { this.message = message; return this; } public Builder<T> data(T data) { this.data = data; return this; } public Response<T> build() { return new Response<>(this); } } /** * Base响应状态接口 */ public interface BaseResponseStatus { int SUCCESS_CODE = 200; int ERROR_CODE = 500; String SUCCESS_MESSAGE = "成功"; String ERROR_MESSAGE = "失败"; /** * 获取状态码 */ Integer getCode(); /** * 获取返回信息 */ String getMessage(); } public enum ResponseStatus implements BaseResponseStatus { /** * 200 成功 使用约定的成功状态码 */ SUCCESS(BaseResponseStatus.SUCCESS_CODE, BaseResponseStatus.SUCCESS_MESSAGE), /** * 500 异常 使用约定的失败状态码 */ ERROR(BaseResponseStatus.ERROR_CODE, BaseResponseStatus.ERROR_MESSAGE), /** * 参数错误 */ ILLEGAL_ARGUMENT(400, "参数错误"), UNAUTHORIZED(401, "未认证"), FORBIDDEN(403, "未授权"), WRONG_PASSWORD(411, "账号或密码错误"), ACCOUNT_DISABLED(412, "账号已被禁用"), ; ResponseStatus(Integer code, String msg) { this.code = code; this.message = msg; } @Override public Integer getCode() { return code; } @Override public String getMessage() { return message; } /** * 返回状态码,{@link ResponseStatus#SUCCESS_CODE SUCCESS(200)}表示成功 */ private final Integer code; /** * 返回描述信息 */ private final String message; } }

2. 响应结果测试

public Response<String> stringResponse() { return Response.<String>builder() .code(201) .message("test message") .data("test data") .build(); }

3.通用分页

import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; /** * <p>通用分页返回</p> * * @author lishaohui * @since 2023/9/20 21:06 */ public class Page<T> implements Serializable { /** * 总条数 */ private long count; /** * 当前页数据 */ private List<T> rows; private Page() { } private Page(long count, List<T> rows) { this.count = count; this.rows = rows; } public Page(Builder<T> builder) { this.count = builder.count; this.rows = builder.rows; } public static <T> Page<T> fill(long count, List<T> rows) { return Page.<T>builder() .count(count) .rows(rows) .build(); } public static <T> Page<T> empty(){ return Page.fill(0, new ArrayList<>()); } public static <T> Builder<T> builder(Page<T> page) { Builder<T> builder = new Builder<>(); builder.count = page.count; builder.rows = page.rows; return builder; } public static <T> Builder<T> builder() { return new Builder<>(); } public long getCount() { return count; } public void setCount(long count) { this.count = count; } public List<T> getRows() { return rows; } public void setRows(List<T> rows) { this.rows = rows; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Page<?> page = (Page<?>) o; return getCount() == page.getCount() && Objects.equals(getRows(), page.getRows()); } @Override public int hashCode() { return Objects.hash(getCount(), getRows()); } @Override public String toString() { return "Page{" + "count=" + count + ", rows=" + rows + '}'; } public static class Builder<T> { private long count; private List<T> rows; private Builder() { } public Builder<T> count(long count) { this.count = count; return this; } public Builder<T> rows(List<T> rows) { this.rows = rows; return this; } public Page<T> build() { return new Page<>(this); } } }

__EOF__

本文作者Hui Li
本文链接https://www.cnblogs.com/leedev-blog/p/17718420.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Hui_Li  阅读(156)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示