spring boot 拦截器HandlerInterceptorAdapter的postHandle和afterCompletion无法获取response返回值问题

时间:2025-03-20 11:53:37
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.MethodParameter; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; import java.lang.reflect.Method; /** * @program: data-service * @description: * @author: blf2 * @create: 2019-10-24 20:52 **/ @ControllerAdvice public class ApiResponseBody implements ResponseBodyAdvice<RestResult> { private static final Logger logger = LoggerFactory.getLogger(ApiResponseBody.class); @Autowired private RedisClientWrapper redisClientWrapper; @Override public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) { Method method = methodParameter.getMethod(); return method.isAnnotationPresent(InvokeLimit.class); } @Override public RestResult beforeBodyWrite(RestResult restResult, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) { logger.info("调用限制拦截器进入次数增加"); if(ResultEnums.SUCCESS.getCode().equals(restResult.getCode())){ String appId = methodParameter.getMethod().getAnnotation(InvokeLimit.class).value(); String cusNo = serverHttpRequest.getHeaders().get(BussConstant.INVOKE_HEADER_CUS_NO).get(0); String times = redisClientWrapper.increment(appId + ":" + BussConstant.INVOKE_NUM_CURRENT_PREFIX + cusNo); logger.info("调用限制拦截器次数增加完成,cusNo={},appId={},当前次数为:{}",cusNo,appId,times); } return restResult; } }