編集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 にすることはできません。
誰でも助けることができますか?