问题描述
- 项目开发之前使用拦截器对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();
}
}
成功解决问题!