编辑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);
}
}
原始
解释后的代码如下:
我有一个带有JavaConfig的Spring应用程序,称之为主应用程序,它从库中导入另一个Spring JavaConfig类。这个导入的JavaConfig应该用一个Aspect包装在主应用程序中创建的任何DataSource,它有一个自动装配的LogDelegator。
只要主应用程序只包含一个DataSource,一切正常。但是,只要我将EntityManager添加到主应用程序,我就会得到一个嵌套的IllegalArgumentException,表示LogDelegator为空。
主要应用程序的配置:
@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.Thread.run中的 java.lang.reflect.InvocationTargetException(Thread.java:722) 引起:org.springframework.beans.factory.BeanCreationException:在类SpringAppConfig中定义名为'entityManagerFactory'的bean时出错:bean的实例化失败;嵌套异常是org.springframework.beans.factory.BeanDefinitionStoreException:工厂方法[publ ic org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean com.fl.sas.configurable.config.SpringAppConfig.entityManagerFactory()]引发异常; NE 另一个例外是org.springframework.beans.factory.BeanCreationException:在类SpringAppConfig中定义名为'dataSource'的bean时出错:bean的实例化失败;嵌套异常是org.springframework.beans.factory.BeanDefinitionStoreException:工厂方法[public javax.sql.DataSource SpringAppConfig.dataSource()]抛出异常;嵌套异常是java.lang.IllegalArgumentException:log4j dbc:logDelegator不能为空。
有人可以帮忙吗?
答案 0 :(得分:0)
我需要补充一下 @Depends(value =" configurationAspect")在dataSource()
上Luca Basso Ricci回答了这个问题。如果他添加了答案,我会给他信用。 :)