grails - 如果指定任何上下文,则grails 2.5 dbm-update总是会因MissingMethodException失败

标签 grails liquibase

如果使用dbm-update指定任何上下文,我们总是会得到异常,无论该上下文是否具有任何changeSets。如果我们不指定上下文,那么我们将获得一切-它可以工作,但显然会创建不合适的数据。

由于没有实际的示例,我们在Windows 8(和Java 7 64位,mysql 5.6)上尝试了许多可能的语法命令,包括:

grails dbm-update --stacktrace --verbose --contexts="ABC"
grails dbm-update --stacktrace --verbose "--contexts=ABC"
grails dbm-update --stacktrace --verbose "--contexts=[ABC]"
grails dbm-update --stacktrace --verbose --contexts=ABC

所有变体都提供以下堆栈跟踪:
groovy.lang.MissingMethodException: No signature of method: liquibase.Liquibase.update() is applicable for argument types: (java.lang.Boolean) values: [true]
Possible solutions: update(java.lang.String), update(int, java.lang.String), update(java.lang.String, java.io.Writer), u
pdate(int, java.lang.String, java.io.Writer), validate(), isCase(java.lang.Object)
        at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:56)
        at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:46)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:110)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:122)
        at DbmUpdate$_run_closure1$_closure2.doCall(DbmUpdate:26)
        at DbmUpdate$_run_closure1$_closure2.doCall(DbmUpdate)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaM
ethodSite.java:207)
        at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.call(PogoMetaMethodSite.java:68)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:110)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:114)
        at _DatabaseMigrationCommon_groovy$_run_closure2$_closure11.doCall(_DatabaseMigrationCommon_groovy:59)
        at _DatabaseMigrationCommon_groovy$_run_closure2$_closure11.doCall(_DatabaseMigrationCommon_groovy)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaM
ethodSite.java:207)
        at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.call(PogoMetaMethodSite.java:68)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:110)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:114)
        at grails.plugin.databasemigration.MigrationUtils.executeInSession(MigrationUtils.groovy:133)
        at grails.plugin.databasemigration.MigrationUtils$executeInSession$3.call(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)

注意:这只是实际堆栈跟踪的一小部分。

我们定义的上下文仅有的变更集如下:
<changeSet id="baseline_data_account_type_uk" author="me.me" context="UK">
    <comment>Insert UK account types</comment>
    <sqlFile path="sql//baseline//account_type_UK.sql" />
</changeSet>

如果我们没有在dbm-update命令行上指定任何上下文,它将在此变更集中正确运行简单的更新SQL没问题,因此它与变更集或changelog无关。

我当然在dev dataSource中删除了“dbCreate = xxx”行。

这是一个完整的猜测,但这可能与插入sql中的 bool(boolean) 类型有关。上面的变更集引用了account_type_UK.sql,它是:
INSERT INTO `account_type` (`id`, `version`, `is_default`, `name`) VALUES
(3, 0, b'1', 'Bonus'),
(4, 0, b'1', 'Demo');

上面的方法可以完美地正确地插入未指定上下文的数据。

另一个线索是,如果指定了上下文,则会得到缺少的方法异常,但不会创建架构。这可能意味着问题出在架构级别。使用通过dbm-gorm-diff生成的单个xml更改日志创建模式。

有任何想法吗?

最佳答案

看起来Grails调用的内容与您拥有的Liquibase版本之间存在版本不兼容的情况。 Grails正在寻找您正在使用的Liquibase版本上不存在的update()版本。您可以检查哪个Liquibase版本应该与Grails 2.5兼容吗?

关于grails - 如果指定任何上下文,则grails 2.5 dbm-update总是会因MissingMethodException失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31673828/

相关文章:

grails - 从主应用程序向grails插件域类添加行为(关系)?

database - 未知参数 "includeObjects"在命令行 liquiBase 中引发异常

docker - 旋转kilna/liquibase-postgres时的“/bin/sh: [/bin/sh,: not found”响应

mysql - 运行 Liquibase : Unknown Reason 时出现意外错误

gradle - Liquibase 3.0.1 Gradle 集成

maven-2 - 清除Grails依赖项缓存

grails - 运行Grails CLI时发生错误:未知主机(504)

Grails 3限制索引 View 中的列

grails - 从 Maven 原型(prototype)创建 grails 项目

maven - Liquibase 与 Maven