我在过去的springboot + vue2的项目中一直使用Result + ResultUtil类来完成前后端的数据交互。 Result类含有以下属性
// 业务流程是否成功,失败返回false
private Boolean success;
// 带有消息
private String message;
// 返回码,失败时返回指定状态码
private ResultCode code;
// 返回业务数据
private T data;
ResultUtil工具类一般都有比较多的重载方法来实现这四个属性的不同构造
/**
* 返回结果工具类
*/
public class ResultUtil<T> {
/**
* 抽象类,存放结果
*/
private final ResultMessage<T> resultMessage;
/**
* 正常响应
*/
private static final Integer SUCCESS = 200;
/**
* 构造话方法,给响应结果默认值
*/
public ResultUtil() {
resultMessage = new ResultMessage<>();
resultMessage.setSuccess(true);
resultMessage.setMessage("success");
resultMessage.setCode(SUCCESS);
}
/**
* 返回数据
*
* @param t 范型
* @return 消息
*/
public ResultMessage<T> setData(T t) {
this.resultMessage.setResult(t);
return this.resultMessage;
}
/**
* 返回成功消息
*
* @param resultCode 返回码
* @return 返回成功消息
*/
public ResultMessage<T> setSuccessMsg(ResultCode resultCode) {
this.resultMessage.setSuccess(true);
this.resultMessage.setMessage(resultCode.message());
this.resultMessage.setCode(resultCode.code());
return this.resultMessage;
}
/**
* 抽象静态方法,返回结果集
* @param t 范型
* @param <T> 范型
* @return 消息
*/
public static <T> ResultMessage<T> data(T t) {
return new ResultUtil<T>().setData(t);
}
/**
* 返回成功
*
* @param resultCode 返回状态码
* @return 消息
*/
public static <T> ResultMessage<T> success(ResultCode resultCode) {
return new ResultUtil<T>().setSuccessMsg(resultCode);
}
/**
* 返回成功
* @return 消息
*/
public static <T> ResultMessage<T> success() {
return new ResultUtil<T>().setSuccessMsg(ResultCode.SUCCESS);
}
/**
* 返回失败
*
* @param resultCode 返回状态码
* @return 消息
*/
public static <T> ResultMessage<T> error(ResultCode resultCode) {
return new ResultUtil<T>().setErrorMsg(resultCode);
}
/**
* 返回失败
*
* @param code 状态码
* @param msg 返回消息
* @return 消息
*/
public static <T> ResultMessage<T> error(Integer code, String msg) {
return new ResultUtil<T>().setErrorMsg(code, msg);
}
// 以下省略
}
这个工具类虽然使用时比较简单,但是看起来着实是代码有点繁琐,正好之前学过建造者模式,使用链式构造可以很好的简化代码
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result<T> {
// 业务流程是否成功,失败返回false
private Boolean success;
// 带有消息
private String message;
// 返回码,失败时返回指定状态码
private ResultCode code;
// 返回业务数据
private T data;
public Result(ResultBuilder<T> resultBuilder){
this.code = resultBuilder.getCode();
this.success = resultBuilder.getSuccess();
this.message = resultBuilder.getMessage();
this.data = resultBuilder.getData();
}
// 内部构造类
@Data
public static class ResultBuilder<T>{
private Boolean success;
private String message;
private ResultCode code;
private T data;
public ResultBuilder<T> setMessage(String message) {
this.message = message;
return this;
}
public ResultBuilder<T> setCode(ResultCode code) {
this.code = code;
return this;
}
public ResultBuilder<T> setData(T data) {
this.data = data;
return this;
}
public Result<T> buildSuccess(){
this.setSuccess(true);
if(this.code == null){
this.code = ResultCode.SUCCESS;
}if(this.message == null){
this.message = this.code.getMessage();
}
return new Result<T>(this);
}
public Result<T> buildError(){
this.setSuccess(false);
if(this.code == null){
this.code = ResultCode.ERROR;
}if(this.message == null){
this.message = this.code.getMessage();
}
return new Result<T>(this);
}
}
}
对于需要用到的属性使用set赋值,最后根据业务来使用buildSuccess或者buildError来构造result类,对于没有指定的message和code可以根据是否为成功相应来设置默认值
以下为一个登入使用案例
public Result login(LoginParam loginParams) {
System.out.println(loginParams);
User user = userMapper.selectUserByName(loginParams.getUsername());
if(user == null) {
return new Result.ResultBuilder<>().setCode(ResultCode.User_Username_NotExist).buildError();
}
if(!user.getPassword().equals(loginParams.getPassword())){
return new Result.ResultBuilder<>().setCode(ResultCode.User_Password_Error).buildError();
}else {
String s = JwtUtil.generateToken(user);
return new Result.ResultBuilder<String>().setData(s).buildSuccess();
}
}
虽然使用上不如ResultUtil工具类简洁,但是不再需要写那么多的重载方法了
如果代码有误或者漏洞,欢迎指正。本人在校学生,代码能力还是挺薄弱的