在Spring Boot中返回一个统一格式的响应,需要依赖于自定义的VO(View Object)层处理,并定义应有的字段,如 codemsgdata 等,而在视图层中直接返回一个统一的VO即可。

视图层返回统一响应

@PostMapping("/login")
	@LoginNotRequired
	public SuccessVO<AuthVO> login(@RequestBody @Validated AuthDTO authDTO) {
		AuthVO authVO = this.authService.login(authDTO);
		return new SuccessVO<>(authVO);
	}

统一响应ResponseVO

@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

在视图层中如果成功则返回 SuccessVO ,同时还可以定义如 CreatedVODeletedVOUpdatedVO 等。

SuccessVO实际可能需要返回一个data参数,所以SuccessVO需要传入泛型的方式来返回最终的data数据。

public class SuccessVO<T> extends ResponseVO<T> {
	public SuccessVO() {
		super(ResultCode.SUCCESS);
	}

	public SuccessVO(T data) {
		super(ResultCode.SUCCESS, data);
	}
}

响应状态信息ResultCode

很多时候我们经常会在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;
}

标题:Spring Boot构建Web API Wheel(二)—— 统一响应
作者:Jeffrey