Question Comment déclarer un bean populator de référentiel en utilisant java config au lieu de XML?


Je travaille sur un projet basé sur Spring qui est (si loin) complètement exempt de XML, sauf que maintenant je suis tombé sur un mur avec le populator du référentiel JPA de Spring:

<repository:jackson-populator location="classpath:data.json" />

Comment ce qui précède serait-il exprimé dans une classe java @Configuration?

Ce post suggère d'utiliser directement FactoryBean: https://stackoverflow.com/a/13566712/1746274

J'ai essayé ça et le plus proche que j'ai eu était le suivant mais ce n'est pas tout à fait correct.

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

Le résultat ci-dessus donne un FactoryBeanNotInitializedException avec le message JacksonRepositoryPopulatorFactoryBean does not support circular references.

Des idées?


14
2017-12-16 01:55


origine


Réponses:


C'est simple en fait:

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

En retournant le FactoryBean lui-même, Spring se chargera d’invoquer toutes les interfaces de rappel nécessaires (c.-à-d. setApplicationContext(…), setBeanClassLoader(…) etc.). Le haricot d'usine est un ApplicationListener et va donc écouter la ContextRefreshedEvent et déclencher la population lorsque le ApplicationContext est entièrement initialisé.


23
2017-12-16 12:47