当前位置: 首页 > 知识库问答 >
问题:

添加bean会破坏Spring配置

昌和悦
2023-03-14

编辑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委托人不能为空。

有人能帮忙吗?

共有1个答案

东郭自强
2023-03-14

我需要在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。发布

  • 这是我的密码: 将按如下方式生成: 都很好。一切都被包装成标签。 现在我需要将这一行添加到上面的代码中: 下面是生成的代码: 但令人惊讶的是,它将被错误地生成: 看到没?元素跳出了标记。我怎么能把所有的东西都放在里面?