自定义拦截器不生效问题记录
新项目里面我把之前的告警添加了进来,添加后发现有个问题:我新增的拦截器一直不生效:我的代码如下
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
这样就能让两个拦截器都能使用了,重新断点测试,可以了

浙公网安备 33010602011771号