【问题标题】:Adding beans breaks Spring Configuration添加 bean 会破坏 Spring 配置
【发布时间】:2013-08-06 14:22:07
【问题描述】:

编辑 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,该 Aspect 具有自动装配的 LogDelegator。

只要主应用程序只包含一个数据源,一切正常。但是,一旦我将 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(Thread.java:722) 处的 java.lang.reflect.InvocationTargetException 原因: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()] 抛出异常;氖 sted 异常是 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 不能为空。

谁能帮忙?

【问题讨论】:

  • 你能指定你在哪个 Config 类中添加了 entitymanager 吗? MonitoringConfig 或 SpringAppConfig。另外,这些配置类是如何加载的?谁在引导应用程序上下文?
  • 当然。 EntityManager 和其他代码已添加到 SpringAppConfig。在这个简单的示例中,Main 类正在引导应用程序上下文,尽管如果我让它工作,它将在 Spring MVC 应用程序中。
  • 似乎方面是在调用datasource() 之后创建的。尝试在datasource()上设置@Depends(value="configurationAspect")
  • 就是这样。添加答案,我会给予信任。

标签: java spring aop aspectj


【解决方案1】:

我需要添加 @Depends(value="configurationAspect") on dataSource()

Luca Basso Ricci 回答了这个问题。如果他添加了答案,我会给他功劳。 :)

【讨论】:

    猜你喜欢
    • 2020-05-23
    • 2013-02-10
    • 2017-01-11
    • 2014-09-10
    • 2018-09-27
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多