在 Spring Boot 中返回一个统一格式的响应,需要依赖于自定义的 VO(View Object)层处理,并定义应有的字段,如 code
、 msg
、data
等,而在视图层中直接返回一个统一的 VO 即可。
@PostMapping("/login")
@LoginNotRequired
public SuccessVO<AuthVO> login(@RequestBody @Validated AuthDTO authDTO) {
AuthVO authVO = this.authService.login(authDTO);
return new SuccessVO<>(authVO);
}
@Getter
@Setter
public class ResponseVO<T> {
private Integer code;
private String msg;
private T data;
public ResponseVO(ResultCode resultCode) {
this.code = resultCode.getCode();
this.msg = resultCode.getMsg();
this.setStatusCode(resultCode.getStatusCode());
}
public ResponseVO(ResultCode resultCode, T data) {
this.code = resultCode.getCode();
this.msg = resultCode.getMsg();
this.setData(data);
this.setStatusCode(resultCode.getStatusCode());
}
/**
* 设置HTTP响应状态码
*/
private void setStatusCode(Integer statusCode) {
ResponseUtil.setResponseHttpStatus(statusCode);
}
}
在 VO 层中需要调用设置 HTTP 响应状态码的方法,具体代码如下:
public class ResponseUtil {
/**
* 设置HTTP响应状态码
*/
public static void setResponseHttpStatus(int statusCode) {
HttpServletResponse response = getResponse();
if (response == null) {
return;
}
response.setStatus(statusCode);
}
}
在视图层中如果成功则返回 SuccessVO
,同时还可以定义如 CreatedVO
、 DeletedVO
、 UpdatedVO
等。
SuccessVO实际可能需要返回一个data参数,所以SuccessVO需要传入泛型的方式来返回最终的data数据。
public class SuccessVO<T> extends ResponseVO<T> {
public SuccessVO() {
super(ResultCode.SUCCESS);
}
public SuccessVO(T data) {
super(ResultCode.SUCCESS, data);
}
}
很多时候我们经常会在 SuccessVO 中把状态信息写死,如成功的提示等,但这么做的话,无法很好的完成国际化转型,并且也不好管理所有的状态码信息。
定义一个 ResultCode
枚举类来管理响应状态信息是一个不错的选择。
@Getter
@AllArgsConstructor
public enum ResultCode {
// 成功 0~9998
SUCCESS(0, 200, "成功"),
CREATED(1, 201, "创建成功"),
UPDATED(2, 200, "更新成功"),
DELETED(3, 200, "删除成功");
private final Integer code;
private final Integer statusCode;
private final String msg;
}