Spring Interceptor未触发:拦截InstituteController响应追加自定义字段失败
问题根因
你当前的实现混淆了Spring MVC拦截器(HandlerInterceptor)和AOP切面两套完全独立的机制,两种实现逻辑混用导致没有任何一套生效:
- 你给类加了
@Aspect注解声明为AOP切面,但没有给类加@Component注解让Spring容器管理,也没有开启AOP自动代理,AOP逻辑不会触发 - 你同时让类继承了
HandlerInterceptorAdapter声明为Spring MVC拦截器,但是没有重写拦截器的任何核心方法(preHandle/postHandle/afterCompletion),而是用了AOP专属的@AfterReturning注解,Spring MVC拦截器的逻辑也不会执行
解决方案
提供两种可选实现,二选一即可:
方案1:使用AOP切面实现(更适合直接修改Controller返回对象)
- 修正AuthInterceptor类定义,去掉Spring MVC拦截器的继承关系,添加容器管理注解:
@Aspect @Component // 必须添加,让Spring扫描到这个切面 public class AuthAspect { private static final Logger LOGGER = LoggerFactory.getLogger(AuthAspect.class); @AfterReturning(pointcut="execution(* com.project.Controllers.InstituteController.*(..))", returning="result") public void afterReturning(JoinPoint joinPoint , Object result) { if (result instanceof BasicResponseModel) { BasicResponseModel m = (BasicResponseModel) result; // 提前给BasicResponseModel类添加somekey属性及对应的get/set方法 m.setSomekey("new value"); LOGGER.info("ActionResponse returned with message [{}]", m); } } }
- 在Spring Boot启动类或者配置类上添加
@EnableAspectJAutoProxy注解,开启AOP自动代理功能。 - 去掉AppConfig中注册拦截器的代码,本方案不需要注册Spring MVC拦截器。
方案2:使用Spring MVC原生响应修改工具(更推荐)
如果你的需求是统一修改Controller返回的JSON响应,Spring提供了ResponseBodyAdvice接口专门处理这类场景,不需要依赖AOP或者拦截器:
@ControllerAdvice(basePackages = "com.project.Controllers") public class CustomResponseAdvice implements ResponseBodyAdvice<BasicResponseModel> { @Override public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) { // 只处理返回值为BasicResponseModel的请求 return returnType.getParameterType() == BasicResponseModel.class; } @Override public BasicResponseModel beforeBodyWrite(BasicResponseModel body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { // 直接修改返回对象即可 body.setSomekey("new value"); return body; } }
额外注意事项
- 检查切点/扫描路径中的包名
com.project.Controllers的大小写是否和实际项目中的包名完全一致,Java包名区分大小写,拼写错误会导致匹配失败 - BasicResponseModel需要新增对应字段的getter/setter方法,否则JSON序列化后不会显示新增的键
内容的提问来源于stack exchange,提问作者Itzik.B
相关产品推荐
相关产品推荐

