统一封装类
这里随便找了一个统一封装类作为示范,相关的部分代码如下所示,这里主要关注于两个属性String message
和T data
与两个重载方法success(String message)
和success(T data)
。
public class BizResponse<T> implements Serializable {
private static final long serialVersionUID = 1L;
private int code;
private String message;
private T data;
public BizResponse() {
this(BizErrorCodeEnum.SUCCESS, BizErrorCodeEnum.SUCCESS.getDesc());
}
public BizResponse(BizEnum errorCode) {
this(errorCode, errorCode.getDesc());
}
public BizResponse(T data) {
this(BizErrorCodeEnum.SUCCESS, BizErrorCodeEnum.SUCCESS.getDesc(), data);
}
public BizResponse(BizEnum errorCode, String message) {
this(errorCode, message, (Object)null);
}
public BizResponse(BizEnum errorCode, String message, T data) {
this.code = errorCode.getCode();
this.message = message;
this.data = data;
}
public static <T> BizResponse<T> success() {
return new BizResponse();
}
public static <T> BizResponse<T> success(String message) {
return new BizResponse(BizErrorCodeEnum.SUCCESS, message);
}
public static <T> BizResponse<T> success(T data) {
return new BizResponse(data);
}
...
}
问题描述
在大多数场景,我们controller的写法如下:
@ApiOperation("Test")
@PostMapping("/test")
public BizResponse<TestResp> testController() {
TestRes res = testService.testMethod();
return BizResponse.success(res);
}
一般情况下,BizResponse.success(res)
调用的是success(T data)
,该方法是调用BizResponse(T data)
实现的,会把code
赋值为操作成功的状态码,并将res
赋值给data
。
但当服务层返回结果是String
类型时,BizResponse.success(res)
调用的是success(String msg)
,该方法是调用BizResponse(BizErrorCodeEnum.SUCCESS, message)
实现的,会把code
赋值为操作成功的状态码,并将res
赋值给message
。此时就把res
错误地赋值给了message
,而不是data
。
问题解决
若没有需要返回的结果,使用BizResponse.success()
或BizResponse.success(String msg)
。
若有需要返回的结果,且返回类型不为String
,使用BizResponse.success(T data)
。
若有需要返回的结果,且返回类型为String
,使用new BizResponse(String data)
。