0

我有一个带有 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 )中创建了问题

4

1 回答 1

0

简单地重命名 bean 声明方法以匹配自动装配的 bean 怎么样?

@Configuration
public class BusinessConfig {
   @Bean 
   public ObjectMapper objectMapper() { return new ObjectMapper() } 
}

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Autowired
    private ObjectMapper objectMapper;
    [...]
}
于 2016-06-19T14:06:30.533 回答