编辑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应该用一个方面包装在主应用程序中创建的任何数据源,这个方面有一个自动连接的LogDelegator。
只要主应用程序只包含一个数据源,一切都正常。但是,当我向主应用程序添加EntityManager时,我会得到一个嵌套的IllegalArgumentException,表示LogDelegator为null。
主应用的配置:
@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在java.lang.Thread.run(Thread.java:722)引起:org.springframework.beans.factory.BeanCreationException:错误创建bean的名称'entityManagerFactory'在类SpringAppConfig中定义:实例化bean失败;嵌套异常是org.springframework.beans.factory.BeanCode itionStoreException:工厂方法[publ icorg.springframework.orm.jpa.LocalContainerEntityManagerFactoryBeancom.fl.sas.configurable.config.SpringAppConfig.entityManagerFactory()]抛出异常;nested异常是org.springframework.beans.factory.BeanCreationException:错误创建bean的名称'dataSource'在类SpringAppConfig中定义:实例化bean失败;嵌套异常是org.springframework.beans.factory.BeanCode itionStoreException:工厂方法[公共javax.sql.DataSource SpringAppConfig.dataSource()]抛出异常;嵌套异常是java.lang.IllegalArgumentException: log4j dbc: log委托人不能为空。
有人能帮忙吗?
我需要在dataSource()上添加@Depend(value="配置方面")
卢卡·巴索·里奇回答了这个问题。如果他再加一个答案,我会给他的
有人知道如何在Redis的Spring会话中添加会话破坏事件吗?我读到正常的方法是不可能的。我愿意这样做,因为我需要在一个会话被破坏(超时或注销)后做一些清理过程。我真的很感激你们的帮助,谢谢你们。
我试图将Spring Security性添加到我的项目中,但是在将它添加到gradle文件并导入更改时,突然Spring数据JPA依赖项不再起作用了。 这是什么原因造成的?
使用这个延迟加载代码,我的lightbox中断:单击一个图像显示lightbox,但没有图像。 通过检查inspector,我可以看到lightbox img标签没有值。我猜在延迟加载将属性和值分配给图像之前,lightbox会检查src。 如何解决此问题?
对于Oracle池连接,我使用,但这些连接似乎在数据库中保持活动状态。今天我在连接到Oracle数据库时遇到了一个错误: ORA-12516:TNS:侦听器找不到具有匹配协议栈的可用处理程序 另外,我在dao级别使用jdk7 try-with-resources语法进行连接: 弄不清真正的问题在哪里。我应该使用c3p0而不是OracleDataSource吗?ojdbc7中是否有bug或我的代码中
我有一个使用投影的查询,只要返回类型是,它就可以正常工作,但添加分页后它就停止工作了。 以下是工作代码: 我需要扩展它添加分页,所以我将其更改为: 我添加的查询过于简化,我的实际查询实际上从不同的表中收集不同的值,如果没有投影,我无法实现它 我使用的是Spring Boot 1.5.8。发布
这是我的密码: 将按如下方式生成: 都很好。一切都被包装成标签。 现在我需要将这一行添加到上面的代码中: 下面是生成的代码: 但令人惊讶的是,它将被错误地生成: 看到没?元素跳出了标记。我怎么能把所有的东西都放在里面?