Quarkus 2.9.2中Flyway无法读取配置占位符问题求助
Quarkus 2.9.2.Final Flyway占位符识别失败修复
问题背景
- 配置路径:
src/test/resources/application.properties - 已写入的Flyway占位符配置:
quarkus.flyway.placeholders.a=a quarkus.flyway.placeholders.b=b
- 迁移脚本中占位符使用方式:
create user ${a} with password '${b}';
- 执行测试时抛出核心异常:
Caused by: org.flywaydb.core.api.FlywayException: No value provided for placeholder: ${a}. Check your configuration! at org.flywaydb.core.internal.parser.PlaceholderReplacingReader.read(PlaceholderReplacingReader.java:165) at java.base/java.io.FilterReader.read(FilterReader.java:65) at org.flywaydb.core.internal.parser.PositionTrackingReader.read(PositionTrackingReader.java:33) at java.base/java.io.FilterReader.read(FilterReader.java:65) at org.flywaydb.core.internal.parser.RecordingReader.read(RecordingReader.java:33) at java.base/java.io.FilterReader.read(FilterReader.java:65) at org.flywaydb.core.internal.parser.PeekingReader.refillPeekBuffer(PeekingReader.java:73) at org.flywaydb.core.internal.parser.PeekingReader.peek(PeekingReader.java:183) at org.flywaydb.core.internal.parser.PeekingReader.peek(PeekingReader.java:165) at org.flywaydb.core.internal.parser.Parser.readToken(Parser.java:478) at org.flywaydb.core.internal.parser.Parser.getNextStatement(Parser.java:173) ... 73 more
- 配置有效性验证:通过自定义
@ConfigMapping类可正常读取到placeholders下的全部键值对,配置写入逻辑无问题。
@ConfigMapping(prefix = "quarkus.flyway") interface MyConfig { Map<String,String> placeholders(); }
根因说明
Quarkus 2.9.x系列版本的Flyway扩展存在两处默认配置与预期不符的问题:
- 该版本默认关闭了Flyway占位符替换开关,未显式开启时,扩展不会将配置中定义的
placeholders集合传递给底层Flyway引擎,因此引擎无法读取到任何占位符值 - 该版本修改了Flyway原生默认的占位符前后缀,原生默认前后缀为
${和},Quarkus该版本默认配置为{和},与脚本中使用的${}格式不匹配
修复方法
在配置文件中补充两项显式配置即可解决:
# 显式开启占位符替换功能 quarkus.flyway.placeholder-replacement=true # 显式指定占位符前后缀匹配${}写法 quarkus.flyway.placeholder-prefix=${ quarkus.flyway.placeholder-suffix=}
添加配置后重新执行测试,Flyway即可正常解析替换脚本中的占位符,异常消失。
内容的提问来源于stack exchange,提问作者syr
相关产品推荐
相关产品推荐

