小知识,大挑战!本文正在参与“程序员必备小知识”创作活
写在前面
每个接口,每个公司,每个项目工程都应该有自己统一风格的返回,这是和前端的约定,这是每一套代码的“脸面”。至关重要。
下面大家看看我们平时怎么用的骚操作。
统一返回ResultBO
话不多说,直接上代码
/**
* http 响应数据结构
* @author yn
* @date 2021/10/23.
*/
public class ResultBO<T> implements Serializable {
//失败
public static final int ERROR = 0;
//成功
public static final int SUCCESS = 1;
//返回结果标示
private Integer completeCode;
//业务标示
private String reasonCode;
//业务 错误日志或者成功代码
private String reasonMessage;
//业务参数返回(任何类型)
private T data;
/**
* 外部不要直接new对象
* 用builder模式
*/
private ResultBO(Builder<T> builder) {
this.reasonCode = builder.reasonCode;
this.reasonMessage = builder.reasonMessage;
this.completeCode = builder.completeCode;
this.data = builder.data;
}
@Deprecated
public ResultBO(){
}
public Integer getCompleteCode() {
return completeCode;
}
public String getReasonCode() {
return reasonCode;
}
public String getReasonMessage() {
return reasonMessage;
}
public T getData() {
return data;
}
@Deprecated
public ResultBO<T> setCompleteCode(Integer completeCode) {
this.completeCode = completeCode;
return this;
}
@Deprecated
public ResultBO<T> setReasonCode(String reasonCode) {
this.reasonCode = reasonCode;
return this;
}
@Deprecated
public ResultBO<T> setReasonMessage(String reasonMessage) {
this.reasonMessage = reasonMessage;
return this;
}
@Deprecated
public ResultBO<T> setData(T data) {
this.data = data;
return this;
}
public boolean isResponseOk(){
return this.getCompleteCode() != null && this.getCompleteCode() == SUCCESS;
}
@Override
public String toString() {
return "ResultBO{" +
"completeCode=" + completeCode +
", reasonCode='" + reasonCode + ''' +
", reasonMessage='" + reasonMessage + ''' +
", data=" + (data == null ? "null" : data.toString()) +
'}';
}
public static ResultBO responseFail(String s) {
return ResultBO.Builder.init().setFailMessage(s).build();
}
public static ResultBO ResultBOEnum(ResultBOEnum rresultBOEnum) {
return ResultBO.Builder.init().setResultBOEnum(resultBOEnum).build();
}
public static ResultBO responseOK() {
return ResultBO
.Builder
.init()
.setResultBOEnum(ResultBOEnum.SUCCESS)
.build();
}
public static class Builder<K>{
private Integer completeCode;
private String reasonCode;
private String reasonMessage;
private K data;
private Builder(ResultBOEnum resultBOEnum){
if (resultBOEnum == ResultBOEnum.SUCCESS){
this.completeCode = SUCCESS;
} else {
this.completeCode = ERROR;
}
this.reasonCode = resultBOEnum.getCode();
this.reasonMessage = resultBOEnum.getMessage();
}
static public <K> Builder<K> init() { return new Builder<>(ResultBOEnum.SUCCESS); }
public Builder<K> setCompleteCode(int code) {
this.completeCode = code;
return this;
}
public Builder<K> setReasonCode(String code) {
this.reasonCode = code;
return this;
}
public Builder<K> setReasonMessage(String msg) {
this.reasonMessage = msg;
return this;
}
public Builder<K> setFailMessage(String msg) {
this.reasonMessage = msg;
this.completeCode = ERROR;
return this;
}
public Builder<K> setResultBOEnum(ResultBOEnum resultBOEnum) {
if (resultBOEnum == ResultBOEnum.SUCCESS){
this.completeCode = SUCCESS;
} else {
this.completeCode = ERROR;
}
this.reasonMessage = resultBOEnum.getMessage();
this.reasonCode = resultBOEnum.getCode();
return this;
}
public Builder<K> setData(K k) {
this.data = k;
return this;
}
public ResultBO<K> build() { return new ResultBO<>(this); }
}
}
代码很简单 拿去即用,也可以进行二次开发。统一返回code我们采用了阿里规约规定的返回code。下面看下
/**
* ResultBO 返回码
* @author yn
*/
public enum ResultBOEnum {
/**
* 码表注释
* A业务错误,B系统错误,C第三方调用错误
* 数字前两位为业务,后三位为错误码,1开始到999,0为保留位
* 业务码表
* 01:用户
* 04:优惠券
* .....
*/
SUCCESS("000000", "成功"),
/**
* 用户码表
*/
ERROR_A01001("A01001", "用户不存在"),
/**
* 优惠券码表
*/
ERROR_A04001("A04001", "活动已结束"),
ERROR_A04002("A04002", "优惠券不可用"),
ERROR_A04003("A04003","很抱歉,优惠券领光了!下次早点来哟~"),
........
/**
* 系统异常码表
*/
ERROR_B00001("B00001","系统执行异常"),
ERROR_B00002("B00002","系统执行超时");
private String code;
private String message;
ResponseBOEnum(String code, String message) {
this.code = code;
this.message = message;
}
public String getCode() {
return this.code;
}
public String getMessage() {
return this.message;
}
}
两者结合使用,让你代码显得更专业,接口更健壮,我们看下如何使用。
/**
* 测试统一返回
* @return
*/
@RequestMapping(value = "testApi")
public ResultBO testApi(@RequestParam("userId") Integer userId){
User user = userService.findById(userId);
if(null == user){
return ResultBO.responseFail("用户不存在")
}
//业务处理成功
return ResultBO.responseOK();
}
总结
统一返回是根据自己公司业务自定义,没有完全适合,只能说大体适用即可
弦外之音
感谢你的阅读,如果你感觉学到了东西,麻烦您点赞,关注。也欢迎有问题我们下面评论交流
加油! 我们下期再见!
给大家分享几个我前面写的几篇骚操作