【问题标题】:Placeholder replacement not working with flyway test extensions占位符替换不适用于飞路测试扩展
【发布时间】:2012-10-01 23:57:21
【问题描述】:

我正在尝试在 flyway 测试扩展 1.7.0 中使用占位符。 我在 flyway.properties 中定义了一个占位符:

  flyway.placeholders.schema_name=MYSCHEMA

我的 sql 脚本是这样的:

  create schema ${schema_name};

运行flyway测试时,出现以下错误:

117157 [main] DEBUG com.googlecode.flyway.core.migration.sql.SqlScript  - Found statement at line 1: create schema ${schema_name};
117157 [main] DEBUG com.googlecode.flyway.core.migration.sql.SqlStatement  - Executing SQL: create schema ${schema_name}
117157 [main] ERROR com.googlecode.flyway.core.migration.DbMigrator  - com.googlecode.flyway.core.exception.FlywayException: Error executing statement at line 1: create schema ${schema_name}
117158 [main] ERROR com.googlecode.flyway.core.migration.DbMigrator  - Caused by org.hsqldb.HsqlException: Unknown JDBC escape sequence: {: {schema_name}
117158 [main] DEBUG com.googlecode.flyway.core.migration.DbMigrator  - Finished migrating to version 1.1 (execution time 00:00.005s)

所以看起来占位符替换不起作用。 顺便说一句,我的 flyway.properties 文件已成功加载(我也将它用于其他值,例如 jdbc url)。

有人知道这可能是什么问题吗?

EDIT1 好像没有调用 Flyway 类中的 configure 方法。我必须在应用程序上下文中添加一些东西吗?

EDIT2 我们找到的一种解决方案是在应用程序上下文中设置占位符:

<bean id="flyway" class="com.googlecode.flyway.core.Flyway"
    depends-on="dataSourceRef">
    <property name="dataSource" ref="dataSourceRef" />
    <property name="placeholders" >
      <map>
        <entry key="schema_name" value="${flyway.placeholders.schema_name}" />
     </map> 
    </property>
</bean>

但我们仍在寻找更好的解决方案...

【问题讨论】:

    标签: flyway


    【解决方案1】:

    抱歉,回复晚了。今天第一次看到你的问题。

    我接受了您的问题,另请参阅 http://code.google.com/p/flyway-test-extensions/issues/detail?id=14

    默认实现和示例没有显示它如何工作或提供足够的实用程序来解决它。

    解决方案只能用spring部分取决于flyway-test-extensions的实现。

    a.) 解决方案的第一部分

    这不是一个完整的解决方案,因为 flyway.placeholders. 的替换将在 Flyway 内部通过方法 configure 完成,我们无法调用。

    在您的应用程序上下文中添加以下内容:

    <!-- also need this as additional include part  -->
    
    xmlns:util="http : //www.springframework.org/schema/util"
    xsi:schemaLocation="
        http: // www.springframework.org/schema/util 
        http: // www.springframework.org/schema/util/spring-util-3.0.xsd
    

    <!-- flyway part -->
    <util:properties id="flyway.prop" location="/flyway.properties"/>
    
    <bean id="flyway" class="com.googlecode.flyway.core.Flyway" depends-on="dataSourceRef">
        <property name="dataSource" ref="dataSourceRef"/>
        <property name="placeholders" ref="flyway.prop"/>
    </bean>
    

    但与您的 flyway.properties 文件相比,您必须从属性定义中删除 flyway.placeholders.。我认为这不是完整的解决方案。

    b.) 第二部分

    编辑

    更好的解决方案使用当前 flyway-test-extension 开发中的签入。(http://code.google.com/p/flyway-test-extensions/source/detail?r=921f44bb206527db88f4b59faaf7ea968a743233)

    • FlywayHelperFactory.java 作为 Flyway 的工厂实现。将此作为测试源的一部分。
      这也适用于 1.7 版本。
    • flywayPropertiesContext.xml 作为新的应用程序上下文。将其作为测试/资源放在名为 context 的目录中。
      这包含如何加载 flyway.properties 的两个示例解决方案。
      注意:
      此上下文不使用 jdbc.properties 变量,而是使用 flyway 属性!
      此上下文也应与 flyway-test-extension 1.7.0 一起使用
    • 更改您的测试设置并使用@ContextConfiguration(locationsForMirgation = { "/context/flywayPropertiesContext.xml" }) 作为新配置。

    弗洛里安

    【讨论】:

      猜你喜欢
      • 2011-07-28
      • 2019-06-04
      • 1970-01-01
      • 2016-07-15
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      相关资源
      最近更新 更多