【问题标题】:The order of loading locations in Spring @ContextConfigurationSpring @ContextConfiguration 中加载位置的顺序
【发布时间】:2013-05-20 07:28:12
【问题描述】:

我正在为我的数据库集成测试使用以下配置:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring/spring-master.xml"})
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false)
@Transactional()
public class EmployeeAccessPropertyTest {

spring-master.xml 按以下顺序加载 spring 配置文件:

<import resource="classpath:spring/db/dev-datasource-config.xml"/>
<import resource="classpath:spring/db/jpa-config.xml"/>
<import resource="classpath:spring/db/transaction-config.xml"/>
<import resource="classpath:spring/db/component-config.xml"/>

dev-datasource-config.xml 定义dataSource并通过liquibase初始化db scheme:

<context:property-placeholder location="classpath:db/config/dev-data-access.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>
<bean id="liquibase" class="liquibase.integration.spring.SpringLiquibase">
    <property name="dataSource" ref="dataSource" />
    <property name="changeLog" value="classpath:db/changelog/db.changelog-master.xml" />
    <property name="dropFirst" value="true" />
</bean>

现在,当我运行测试时,我收到以下错误:

javax.persistence.PersistenceException: [PersistenceUnit: studentPersistenceUnit] Unable to build EntityManagerFactory
...
Caused by: org.hibernate.HibernateException: Missing table: employees

似乎,初始化 entityManagerFactory 时没有创建表(在 jpa-config.xml 文件中)。好的,我先通过liquibase maven插件生成方案:

mvn initialize liquibase:update

通过 Spring 上下文注释以下 db 方案生成:

<!--<bean id="liquibase" class="liquibase.integration.spring.SpringLiquibase">-->
    <!--<property name="dataSource" ref="dataSource" />-->
    <!--<property name="changeLog" value="classpath:db/changelog/db.changelog-master.xml" />-->
    <!--<property name="dropFirst" value="true" />-->
<!--</bean>-->

问题就解决了。我该怎么做才能确保 Spring 首先加载 dev-datasource-config.xml,初始化 liquibase bean,然后才加载 jpa-config.xml,如下所示:

<bean id="entityManagerFactory"
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
      p:dataSource-ref="dataSource"/>

【问题讨论】:

    标签: java spring configuration liquibase


    【解决方案1】:

    使用 'depends-on' 属性,如 spring 手册中所述:

    http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/beans.html#beans-factory-dependson

    例如

    <bean id="beanOne" class="ExampleBean" depends-on="manager"/>
    
    <bean id="manager" class="ManagerBean" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      相关资源
      最近更新 更多