Spring 引导 MVC 自动配置被 WebMvcConfigurationSupport 阻止

Spring Boot MVC Autoconfiguration Blocked by WebMvcConfigurationSupport

我有一个库 JAR,它利用 Spring 启动自动配置来注册一个用于日志记录的拦截器。

我的问题是,当我将库作为依赖项添加到特定 Spring 启动项目时,拦截器未注册。它适用于我们所有其他 Spring 引导项目。

None 我在库代码中的断点是在调试模式下命中的。

问题 Spring 引导项目确实有 @SpringBootApplication 并且有 Spring MVC 通过 spring-boot-starter-web

这个 class 扩展 WebMvcConfigurationSupport 似乎阻止了我的拦截器被注册:

@Configuration
public class JacksonHttpMessageConfig extends WebMvcConfigurationSupport
{

    @Bean
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper om = new ObjectMapper();
        om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        om.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
        jsonConverter.setObjectMapper(om);
        return jsonConverter;
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(mappingJackson2HttpMessageConverter());
        super.addDefaultHttpMessageConverters(converters);
    }

}

当我删除这个class时,拦截器注册成功

为什么会发生这种情况,解决方法是什么?

如果我对你的理解正确的话,你正试图在另一个 spring-boot 模块中包含一个 spring-boot 模块。这不起作用,因为 spring 引导模块的编译和打包方式意味着您不能将其视为库。

要解决这种情况,您需要创建一个新的库模块并将要在其他模块中使用的代码提取到这个新模块中。

我发现问题是 Spring Boot 在看到扩展 WebMvcConfigurationSupport.[=13 的 @Configuration class 时禁用 MVC 组件的自动配置=]

解决方案是 class 不扩展 WebMvcConfigurationSupport

您可以尝试 implements WebMvcConfigurer 而不是 extends WebMvcConfigurationSupport