【发布时间】: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 Context和Application Layer Contex是如何引用主点访问的 -
我试了一下“同名”,但没有成功...
-
你应该分享你如何通过JavaConfig引用
Web Layer Context和Application Layer Context的源代码,该文件必须替换web.xml,否则社区无法前进来帮助你。
标签: spring spring-mvc configuration autowired objectmapper