springboot: 配置消息转换器后,拦截器无效,出现No mapping for GET xxx

问题描述

  • 项目开发之前使用拦截器对controller的访问进行拦截,一切功能正常。今天在项目中加入消息转换器后,发现无论访问什么网页,都是404错误,No mapping for GET xxx
    在这里插入图片描述

问题分析

  • 出现的错误很像是拦截器没有配置对导致的,通过注释WebMvcConfigMsgConverter消息转换器后,发现项目和原理一样能够正常运行,初步怀疑是拦截器和消息转换器发生了冲突。
  • 由于消息转换器中:将消息转换器对象追加到mvc框架的转换器集合中converters.add(0,messageConverter);这里设置了一个优先级0,表示在所有配置之前生效当前配置,优先级最高,于是怀疑是当前消息转换器的执行后就不再执行拦截器。
  • 将两个配置文件整合到一起,发现奇怪的错误,即满足单继承,又实现了接口,idea提示我们要重写很多方法,但是单独实现接口是不用重写这些default方法的。

解决方案

  • 查找资料发现在 SpringBoot 2.0 后,官方推荐直接实现WebMvcConfigurer或者直接继承WebMvcConfigurationSupport,方式一实现WebMvcConfigurer接口(推荐),方式二继承WebMvcConfigurationSupport类。其实使用其中一种方法就可以完成对应的功能!这里使用实现接口的方法!
@Slf4j
@Configuration
public class BackendWebMvcConfig implements WebMvcConfigurer {
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        log.info("拓展消息转换器成功加载");
        //创建消息转换器对象
        MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
        //设置对象转换器,底层使用Jackson将Java对象转为json
        messageConverter.setObjectMapper(new JacksonObjectMapper());
        //将上面的消息转换器对象追加到mvc框架的转换器集合中
        converters.add(0,messageConverter);
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //重写方法,添加拦截器方法
        registry.addInterceptor(loginInterceptor())
                //拦截哪些路径
                .addPathPatterns("/**")
                //不拦截路径
                .excludePathPatterns("/employee/backend/page/login/login.do",
                        "/backend/**",
                        "/employee/backend/page/login/logout.do",
                        "/front/**",
                        "/error"
                );
    }

    @Bean
    public LoginInterceptor loginInterceptor(){
        return new LoginInterceptor();
    }

}

成功解决问题!
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值