You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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返回对象)

  1. 修正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);
        }
    }
}
  1. 在Spring Boot启动类或者配置类上添加@EnableAspectJAutoProxy注解,开启AOP自动代理功能。
  2. 去掉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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:48:04