How to declare a respository populator bean using

2019-02-11 21:54发布

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" />

How would the above be expressed in a java @Configuration class?

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();
}

The above results in a FactoryBeanNotInitializedException with the message JacksonRepositoryPopulatorFactoryBean does not support circular references.

Any ideas?

1条回答
Deceive 欺骗
2楼-- · 2019-02-11 22:33

It's straight-forward actually:

@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;
  }
}

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.

查看更多
登录 后发表回答