惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
雷峰网
雷峰网
Last Week in AI
Last Week in AI
T
Tailwind CSS Blog
V
Visual Studio Blog
Jina AI
Jina AI
博客园 - 司徒正美
The Cloudflare Blog
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
S
SegmentFault 最新的问题
博客园 - 三生石上(FineUI控件)
有赞技术团队
有赞技术团队
小众软件
小众软件
V
V2EX
Apple Machine Learning Research
Apple Machine Learning Research
美团技术团队
博客园 - 【当耐特】
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
WordPress大学
WordPress大学
爱范儿
爱范儿
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏

博客园 - Doyourself!

rocketmq 启动后 在mq console界面的consumer的Quantity数量显示为0 问题记录 python 切换版本后 提示 无法在python 3.11(.venv)(D:/my_rag_bot/.venv/Scripts/python.exe)设置 python sdk,该sdk似乎无效 记录一次日志告警随着nacos文件动态刷新而失效的问题 多个WebMvcConfigurer配置Jackson2ObjectMapperBuilder不生效问题记录 记录一次nginx能通但是请求一直不了的问题 idea远程连接并本地打包到远程服务器 记一次生产环境内存溢出记录 凤凰架构总结 sentinel接入记录 JVM虚拟机总结 记录一次首页优化的经历 使用sharding-jdbc做分库分表记录 使用druid自定义拦截器 记录一次 maven 子模块相互依赖导致的父模块无法动态升级的问题 'parent.relativePath' points at wrong local POM 雪花算法snowflakeIdWorker使用记录 全局调用链路traceId网关到业务层、feign调用统一问题记录 Spring Cloud 的ribbon的饥饿加载机制 打印mq异常消息记录 根据druid将慢sql通过钉钉的方式进行告警功能记录
自定义拦截器不生效问题记录
Doyourself! · 2025-12-09 · via 博客园 - Doyourself!

      新项目里面我把之前的告警添加了进来,添加后发现有个问题:我新增的拦截器一直不生效:我的代码如下

Configuration
public class OraDingdingConfigurer implements WebMvcConfigurer, Interceptor {

    /**
     * 拦截器参数校验
     *
     * @param interceptorRegistry
     */
    @Override
    public void addInterceptors(InterceptorRegistry interceptorRegistry) {
        //注意拦截器的顺序
        interceptorRegistry.addInterceptor(new CharacterValidInterceptors());
        interceptorRegistry.addInterceptor(new HttpParamVerifyInterceptor());
        interceptorRegistry.addInterceptor(new HttpRequestStatisticsInterceptor());
    }

    @Override
    public void configurePathMatch(PathMatchConfigurer pathMatchConfigurer) {

    }

    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer contentNegotiationConfigurer) {

    }

    @Override
    public void configureAsyncSupport(AsyncSupportConfigurer asyncSupportConfigurer) {

    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer defaultServletHandlerConfigurer) {

    }

    @Override
    public void addFormatters(FormatterRegistry formatterRegistry) {

    }


    @Override
    public void addResourceHandlers(ResourceHandlerRegistry resourceHandlerRegistry) {

    }

    @Override
    public void addCorsMappings(CorsRegistry corsRegistry) {

    }

    @Override
    public void addViewControllers(ViewControllerRegistry viewControllerRegistry) {

    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry viewResolverRegistry) {

    }

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> list) {

    }

    @Override
    public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> list) {

    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> list) {

    }

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> list) {
        //新版本中的
        Optional<HttpMessageConverter<?>> optional = list.stream()
                .filter(o -> o instanceof MappingJackson2HttpMessageConverter)
                .findFirst();
        if (optional.isPresent()) {
            MappingJackson2HttpMessageConverter converter =
                    (MappingJackson2HttpMessageConverter) optional.get();
            /*注意不要使用JsonInclude.Include.NON_NULL,会影响端上取data的问题*/
           /* ObjectMapper mapper = converter.getObjectMapper();
            mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);*/

        }
    }

    @Override
    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> list) {
    }

    @Override
    public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> list) {
        //todo 添加全局异常,因为HandlerInterceptor不能显示异常 之前是写到了configureHandlerExceptionResolvers 里面,使用哪个会和全局异常DefaultGlobalExceptionHandler有先后顺序问题
       list.add(0,new DingdingHandleException());
    }

    @Override
    public Validator getValidator() {
        return null;
    }

    @Override
    public MessageCodesResolver getMessageCodesResolver() {
        return null;
    }

    @NotNull
    @Override
    public Response intercept(@NotNull Chain chain) throws IOException {
        Request request = chain.request();
        return chain.proceed(request);
    }

    @Bean
    public DispatcherServlet dispatcherServlet(){
        return new OraDispatcherServlet();
    }

    @Bean
    public DruidStatLogger druidStatLogger(){
        return new DruidStatLogger();
    }

    @Bean
    public OptionalAlarmUriUtils optionalAlarmUriUtils(){
        return new OptionalAlarmUriUtils();
    }

     按说我再本地请求一个方法时候,会进入addInterceptors的方法里面,但是自己测试发现怎么都进入不进去,问了ai,定位到可能是有其他模块使用了@EnableWebMvc导致的,或者包扫描没有到目录里面,但是都测试了下也都是正常配置的,初始化时候也被spring到bean里面了,最后看了半天,发现项目里面有一个类,是

@Configuration
public class WebConfig extends WebMvcConfigurationSupport ,总算找到了这个问题。引用ai的话:
(Spring Boot 官方文档明确说明):
一旦你继承了 WebMvcConfigurationSupport,就等于手动接管了 Spring MVC 的全部配置,Spring Boot 的自动配置 WebMvcAutoConfiguration 会被完全禁用。

这意味着:

所有通过 @Configuration + implements WebMvcConfigurer 声明的配置类(比如你的 OraDingdingConfigurer)
它们的 addInterceptors()、addResourceHandlers() 等方法将永远不会被调用!
因为 Spring Boot 认为:“你已经自己管 MVC 了,我不再插手。”

  只需要把这个类修改一下:

public class WebConfig implements WebMvcConfigurer 
  
这样就能让两个拦截器都能使用了,重新断点测试,可以了