0

編集1:

現在、次のように Main クラスからこれを呼び出しています。

public class Main
{
    public static void main(String[] args)
    {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringAppConfig.class);
        DataSource dSource = ctx.getBean(DataSource.class);
        System.out.println(dSource.getClass().toString());

        if (dSource instanceof Log4jdbcProxyDataSource)
        {
            Log4jdbcProxyDataSource log4jdbcProxyDataSource = (Log4jdbcProxyDataSource) dSource;
            Object lf = log4jdbcProxyDataSource.getLogFormatter();
            System.out.println(lf.getClass().toString());
        }

        System.exit(0);
}

}

オリジナル:

説明の後にコードが続きます。

ライブラリから別のSpring JavaConfigクラスをインポートする、JavaConfigを備えたSpringアプリケーションをプライマリアプリと呼びます。このインポートされた JavaConfig は、プライマリ アプリで作成されたすべての DataSource を、自動配線された LogDelegator を持つ Aspect でラップすることになっています。

プライマリ アプリに DataSource のみが含まれている限り、すべてが機能します。しかし、プライマリ アプリに EntityManager を追加するとすぐに、LogDelegator が null であることを示すネストされた IllegalArgumentException が発生します。

主なアプリの構成:

@Configuration
@Import(MonitoringConfig.class)
public class SpringAppConfig
{
   @Bean
   public DataSource dataSource()
   {
      EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
      EmbeddedDatabase db = builder.setType(EmbeddedDatabaseType.H2).build();
      return db;        
   }
}

インポートされたライブラリ構成:

@Configuration
@EnableSpringConfigured
public class MonitoringConfig extends WebMvcConfigurerAdapter
{
   @Bean
   public LogDelegator logDelegator()
   {
      return new LogDelegator();
   }

   @Bean
   public ConfigurationAspect configurationAspect()
   {
      return Aspects.aspectOf(ConfigurationAspect.class);
   }
}

アスペクト:

@Configurable
public aspect ConfigurationAspect
{
   @Autowired
   LogDelegator logDelegator;

   Object around() : execution(public DataSource (@Configuration *).*(..)) {

   Object ret = proceed();
   if (ret instanceof DataSource) {
      Log4jdbcProxyDataSource dataSource = new Log4jdbcProxyDataSource((DataSource) ret);
      dataSource.setLogFormatter(logDelegator);
      return dataSource;
   } else {
      return ret;
   }

}

このコードは、次を追加するまでうまく機能します。

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory()
{
    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    vendorAdapter.setGenerateDdl(true);
    vendorAdapter.setDatabase(Database.H2);
    vendorAdapter.setShowSql(true);

    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
    factory.setDataSource(dataSource());
    factory.setJpaVendorAdapter(vendorAdapter);

    return factory;
}


@Bean
public EntityManager entityManager()
{
    return entityManagerFactory().getObject().createEntityManager();
}

@Bean
public PlatformTransactionManager transactionManager()
{
    JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
    jpaTransactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
    return jpaTransactionManager;
}

そして、私は得る: java.lang.reflect.InvocationTargetException at java.lang.Thread.run(Thread.java:722) 原因: org.springframework.beans.factory.BeanCreationException: クラス SpringAppConfig で定義された名前 'entityManagerFactory' の Bean 作成エラー: インスタンス化Bean が失敗しました。ネストされた例外は org.springframework.beans.factory.BeanDefinitionStoreException: ファクトリ メソッド [パブリック org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean com.fl.sas.configurable.config.SpringAppConfig.entityManagerFactory()] が例外をスローしました。次の例外は org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class SpringAppConfig: Instantiation of bean failed; です。ネストされた例外は org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public javax.sql. DataSource SpringAppConfig.dataSource()] が例外をスローしました。ネストされた例外は java.lang.IllegalArgumentException: log4j dbc: logDelegator を null にすることはできません。

誰でも助けることができますか?

4

1 に答える 1

0

dataSource() に @Depends(value="configurationAspect") を追加する必要がありました

ルカ・バッソ・リッチが質問に答えました。彼が答えを追加することがあれば、私は彼にクレジットを与えます. :)

于 2014-06-11T13:47:45.823 に答える