16

私は、(これまでのところ) 完全に XML を使用しない Spring ベースのプロジェクトに取り組んでいますが、Spring JPA リポジトリ ポピュレーターで壁にぶつかったことを除きます。

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

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

上記の結果はFactoryBeanNotInitializedException、メッセージ付きですJacksonRepositoryPopulatorFactoryBean does not support circular references

何か案は?

4

1 に答える 1

24

実際には簡単です:

@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されると、 をリッスンし、ContextRefreshedEvent生成をトリガーします。ApplicationContext

于 2012-12-16T12:47:11.173 に答える