2012-12-16 9 views
14

Sto lavorando su un progetto Spring sulla base che è (so-far) completamente XML libero, solo che adesso ho colpito un muro con la Primavera JPA repository Populator:Come dichiarare un bean del populatore respository usando java config al posto di XML?

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

Come sarebbe quanto sopra essere espresso in una classe java @Configuration?

Questo post suggerisce di utilizzare direttamente il FactoryBean: https://stackoverflow.com/a/13566712/1746274

ho provato e la più vicina che ho trovato era il seguente, ma non è proprio così.

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

I risultati di cui sopra in un FactoryBeanNotInitializedException con il messaggio JacksonRepositoryPopulatorFactoryBean does not support circular references.

Qualche idea?

risposta

23

È straight-forward realtà:

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

Riportando la FactoryBean stessa, primavera avrà cura di invocare tutte le interfacce necessarry callback (cioè setApplicationContext(…), setBeanClassLoader(…) ecc). Il bean factory è un ApplicationListener e quindi ascolterà lo ContextRefreshedEvent e attiverà la popolazione quando lo ApplicationContext è completamente inizializzato.

+1

Grazie, Oliver! Questo è esattamente quello che stavo cercando. – MrJohnBBQ

+5

Con spring-data-commons - 1.12.3.RELEASE il nome della classe è 'Jackson2RepositoryPopulatorFactoryBean'. – Dr4gon

Problemi correlati