如何使用java config而不是XML声明存储库populator bean?

MrJ*_*BBQ 15 java spring jpa spring-data spring-data-jpa

我正在开发一个基于Spring的项目(迄今为止)完全没有XML,除了现在我已经使用Spring JPA存储库populator打了一个墙:

<repository:jackson-populator location="classpath:data.json" />
Run Code Online (Sandbox Code Playgroud)

如何在java @Configuration类中表达上述内容?

这篇文章建议直接使用FactoryBean:https://stackoverflow.com/a/13566712/1746274

我试过了,我得到的最接近的是以下但是不太正确.

@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();
}
Run Code Online (Sandbox Code Playgroud)

以上结果FactoryBeanNotInitializedException与消息有关JacksonRepositoryPopulatorFactoryBean does not support circular references.

有任何想法吗?

Oli*_*ohm 23

实际上它是直截了当的:

@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;
  }
}
Run Code Online (Sandbox Code Playgroud)

通过返回FactoryBean自身,春天会照顾调用所有necessarry回调接口(即setApplicationContext(…),setBeanClassLoader(…)等).工厂bean是一个ApplicationListener,因此将ContextRefreshedEventApplicationContext完全初始化时监听并触发填充.

  • 使用spring-data-commons - 1.12.3.RELEASE,类名是`Jackson2RepositoryPopulatorFactoryBean`. (8认同)