Spring JavaConfig + WebMvcConfigurerAdapter + @Autowired => NPE

时间:2016-06-17 18:43:33

标签: spring spring-mvc configuration autowired objectmapper

我有2个上下文的应用程序。用于Web逻辑的Web不可知业务逻辑和ChildContext(由调度程序servlet隐式创建)的父级。

我的设置很像

function myFunction() {
  AWS.init("MY_ACCESS_KEY", "MY_SECRET_KEY");
  var instanceXML = AWS.request('ec2', 'us-east-1', 'DescribeInstances', {"Version":"2015-10-01"});
  ...
}

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

我需要父上下文中的对象映射器,因为我也在安全配置中使用它。但有人可以解释一下,为什么@Autowired objectMapper为null?它在父上下文中创建(父项存在的事实甚至在启动时由spring记录)。另外@Autowired默认情况下要求= true,所以它不应该在configure方法中爆炸(如果由于某种原因bean没有,那么它应该在构造上下文时被炸毁)。

在我看来,春天可能存在一些生命周期问题 - 从某种意义上说,它首先调用被覆盖的方法,然后@Autowires依赖...我还尝试@Autowire BusinessConfig(应该是完美的)根据文件合法 - 结果是相同的(null))。

我该怎么做才能让它发挥作用?

提前致谢!

编辑 - 发现问题

我发现了这个问题。不幸的是,它与WebMvcConfigurerAdapter和@Configuration无关。这是由于propertyPlaceholderConfigurer缺少static修饰符触发的上下文过早初始化引起的...我在Spring core jira中创建了问题(https://jira.spring.io/browse/SPR-14382

1 个答案:

答案 0 :(得分:0)

如何简单地重命名bean声明方法以匹配自动装配的bean?

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

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Autowired
    private ObjectMapper objectMapper;
    [...]
}