使用 @ControllerAdvice & ResponseBodyAdvice 可以拦截Controller方法默认返回参数,统一处理返回值/响应体
如:如果需要对所有ResponseDto返回类型的响应值中加入处理耗时、链路追踪reqId,可以进行如下编码
@ControllerAdvice
public class ResponseBodyHandler implements ResponseBodyAdvice {
@Override
public boolean supports(MethodParameter methodParameter, Class aClass) {
// 对所有方法都支持
return true;
}
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType,
Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
if (!(o instanceof ResponseDto)) {
return o;
}
HttpServletRequest httpRequest = ((ServletServerHttpRequest) serverHttpRequest)
.getServletRequest();
ResponseDto response = (ResponseDto) o;
String reqId = (String) httpRequest.getAttribute(LogConstant.REQ_ID);
long startTime = (long) httpRequest.getAttribute(LogConstant.REQ_START_TIME);
long cost = System.currentTimeMillis() - startTime;
response.setReqId(reqId);
response.setCost(cost);
return response;
}
}
本文介绍如何利用@ControllerAdvice和ResponseBodyAdvice在Spring MVC中全局拦截Controller方法的返回值,实现统一添加请求处理时间、链路追踪ID等信息到响应体中。
4万+

被折叠的 条评论
为什么被折叠?



