如何使用 java config 而不是 XML 声明一个存储库填充器 bean?
我正在开发一个基于 Spring 的项目,该项目(到目前为止)完全没有 XML,但现在我在 Spring JPA 存储库填充器上遇到了困难:
I am working on a Spring based project that is (so-far) completely XML-free, except now I've hit a wall with the Spring JPA repository populator:
<repository:jackson-populator location="classpath:data.json" />
如何在 java @Configuration 类中表达以上内容?
How would the above be expressed in a java @Configuration class?
这篇文章建议直接使用 FactoryBean:https://stackoverflow.com/a/13566712/1746274
This post suggests using the FactoryBean directly: https://stackoverflow.com/a/13566712/1746274
我试过了,我得到的最接近的是以下,但它不太正确.
I tried that and the closest I got was the following but it's not quite right.
@Bean(name="repositoryPopulator")
public RepositoryPopulator getRespositoryPopulator() throws Exception {
final JacksonRepositoryPopulatorFactoryBean factory = new JacksonRepositoryPopulatorFactoryBean();
factory.getObject().setResourceLocation("classpath:test-data.json");
factory.afterPropertiesSet();
return factory.getObject();
}
上述结果导致 FactoryBeanNotInitializedException
消息 JacksonRepositoryPopulatorFactoryBean 不支持循环引用
.
The above results in a FactoryBeanNotInitializedException
with the message JacksonRepositoryPopulatorFactoryBean does not support circular references
.
有什么想法吗?
推荐答案
其实很简单:
@Configuration
class ApplicationConfig {
@Bean
public JacksonRepositoryPopulatorFactoryBean repositoryPopulator() {
Resource sourceData = new ClassPathResource("test-data.json");
JacksonRepositoryPopulatorFactoryBean factory = new JacksonRepositoryPopulatorFactoryBean();
// Set a custom ObjectMapper if Jackson customization is needed
factory.setObjectMapper(…);
factory.setResources(new Resource[] { sourceData });
return factory;
}
}
通过返回 FactoryBean
本身,Spring 将负责调用所有必要的回调接口(即 setApplicationContext(…)
、setBeanClassLoader(…)代码>等).工厂 bean 是一个
ApplicationListener
,因此将在 ApplicationContext
完全初始化时侦听 ContextRefreshedEvent
并触发填充.
By returning the FactoryBean
itself, Spring will take care of invoking all the necessarry callback interfaces (i.e. setApplicationContext(…)
, setBeanClassLoader(…)
etc.). The factory bean is an ApplicationListener
and thus will listen to the ContextRefreshedEvent
and trigger population when the ApplicationContext
is fully initialized.
相关文章