【问题标题】:Spring JavaConfig + WebMvcConfigurerAdapter + @Autowired => NPESpring JavaConfig + WebMvcConfigurerAdapter + @Autowired => NPE
【发布时间】:2016-06-17 18:43:33
【问题描述】:

我有一个包含 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 不存在,它应该在上下文的构造中爆炸)。

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

我应该怎么做才能使它工作?

提前致谢!

编辑 - 发现问题

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

【问题讨论】:

  • 实际上 spring 的父子关系是相反的。父上下文看不到任何子上下文 bean。但是孩子看到所有的父母豆。没有组件扫描,只有显式创建的@Beans。
  • 是的,我的错。子代代表 Web,父代代表服务器端,子代可以引用/使用父代中定义的 bean。你能在JavaConfig中发布代表web.xml的代码吗?在那里我们可以看到Web Layer ContextApplication Layer Contex 是如何引用主点访问的
  • 我没有确切的代码,但这是模式:docs.spring.io/spring-javaconfig/docs/1.0.0.m3/reference/html/…
  • 我试了一下“同名”,但没有成功...
  • 你应该分享你如何通过JavaConfig引用Web Layer ContextApplication Layer Context的源代码,该文件必须替换web.xml,否则社区无法前进来帮助你。

标签: spring spring-mvc configuration autowired objectmapper


【解决方案1】:

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

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

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

【讨论】:

  • 周一试试。但我想这应该没什么区别,因为默认的@Autowired 模式应该是 byType
猜你喜欢
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
  • 2017-06-03
  • 1970-01-01
相关资源
最近更新 更多