我有一个带有 2 个上下文的应用程序。与 Web 无关的业务逻辑的父级和 Web 逻辑的 ChildContext(由调度程序 servlet 隐式创建)。
我的设置看起来像
@Configuration
public class BusinessConfig {
@Bean
public ObjectMapper jacksonMapper() { return new ObjectMapper() }
}
和
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Autowired
private ObjectMapper objectMapper; // <- is null for some reason
@Override
public configureMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(objectMapper); // <- bang!
messageConverters.add(converter);
}
}
我需要父上下文中的对象映射器,因为我也在安全配置中使用它。但是有人可以解释一下,为什么@Autowired objectMapper 为空?它在父上下文中创建(父存在的事实甚至在启动时由 spring 记录)。@Autowired 默认情况下还需要=true,因此它不应该在配置方法中爆炸(如果由于某种原因 bean 不存在,它应该在上下文的构造中爆炸)。
在我看来,春天可能存在一些生命周期问题 - 从某种意义上说,它首先调用覆盖的方法,然后 @Autowires 依赖关系......我也尝试过 @Autowire BusinessConfig(根据文档 - 结果相同(null))。
我应该怎么做才能使它工作?
提前致谢!
编辑 - 发现问题
我发现了这个问题。不幸的是,它与 WebMvcConfigurerAdapter 和 @Configuration 无关。它是由缺少 propertyPlaceholderConfigurer 的静态修饰符触发的上下文过早初始化引起的...我在 Spring 核心 jira ( https://jira.spring.io/browse/SPR-14382 )中创建了问题