带有数据库迁移插件的 Grails 3:类 [com.mypackage.security.RequestMap] 上的方法在 Grails 应用程序之外使用

Posted

技术标签:

【中文标题】带有数据库迁移插件的 Grails 3:类 [com.mypackage.security.RequestMap] 上的方法在 Grails 应用程序之外使用【英文标题】:Grails 3 with database-migration plugin: Method on class [com.mypackage.security.RequestMap] was used outside of a Grails application 【发布时间】:2016-01-19 19:08:59 【问题描述】:

我正在使用带有 database-migration 插件的 Grails 3.0.7。我有超级简单的迁移,我无法开始工作:

databaseChangeLog = 
    changeSet(id: '20150926BaseSecurityConfig', author: 'me') 
        grailsChange 
            change 
                    new RequestMap('/home', 'permitAll').save(failOnError: true, flush: true)
            
        
    

仅此而已。我在另一个运行 Grails 2.3.7 的项目中进行了类似的迁移,没有任何问题。在这里,我得到了这个异常:

Caused by: java.lang.IllegalStateException: Method on class [com.mysite.security.RequestMap] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)

另外,如果我将new RequestMap 行放在BootStrap.groovy 中,它会保存得很好。我不确定这里有什么问题。

【问题讨论】:

您能提供您的DataSource.groovy 配置吗? 另外,你的hibernate插件版本是多少? 你在使用 grails-3 插件吗?请记住,页面上https://grails.org/plugins/ 是 grails 1 和 2 的插件。为 grails-3 准备的插件在这里https://bintray.com/grails/plugins 【参考方案1】:

插件需要认真修改,大部分语句都不起作用。

始终使用 XML 和本机 SQL。它完美无瑕:

<?xml version="1.0" encoding="UTF-8"?>

<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.0.xsd
        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">

    <changeSet author="me" id="201510201650_ins_data_into_foo_bar">
        <sql>
            INSERT INTO foo.bar(code, name) VALUES(1, 'demo');
            INSERT INTO foo.bar(code, name) VALUES(2, 'demo2');
        </sql>
        <rollback>
            DELETE FROM foo.bar WHERE code BETWEEN 1 AND 2;
        </rollback>
    </changeSet>

</databaseChangeLog>

【讨论】:

是的,这就是我最终所做的。可惜插件还处于这么糟糕的状态。【参考方案2】:

我使用 SQL 语句进行数据库迁移。

databaseChangeLog = 

        changeSet(author: "me", id: "20150926BaseSecurityConfig") 

            preConditions(onFail: 'MARK_RAN', onFailMessage: 'RequestMap already exists' )
                sqlCheck(expectedResult: '0', "SELECT count(*) FROM request_map WHERE url = '/home' and configAttribute = 'permitAll'")
            

            sql("""
                    INSERT INTO request_map(url, configAttribute)
                    VALUES ('/home', 'permitAll')
            """)
        
    

【讨论】:

【参考方案3】:
<?xml version="1.0" encoding="UTF-8"?>    
<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.0.xsd
        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">

    <changeSet author="me" id="20150926BaseSecurityConfig">
        <sql>
            INSERT INTO request_map(url, configAttribute)
    SELECT v.url, v.c FROM (SELECT '/home' as url, 'permitAll' as c) as v
           WHERE NOT EXISTS(SELECT m.* FROM request_map as m 
                         WHERE m.url = v.url AND m.configAttribute = v.c);
        </sql>
        <rollback>
            DELETE FROM request_map WHERE url LIKE '/home' AND configAttribute LIKE 'permitAll';
        </rollback>
    </changeSet>

</databaseChangeLog>

【讨论】:

以上是关于带有数据库迁移插件的 Grails 3:类 [com.mypackage.security.RequestMap] 上的方法在 Grails 应用程序之外使用的主要内容,如果未能解决你的问题,请参考以下文章

Grails 2.3 数据库迁移上的“加载插件管理器时出错:TomcatGrailsPlugin”

在 Grails 3.x 中应该使用 Spring Sec OAuth 的哪个插件/模块?

Grails 数据库迁移 - dbm-gorm-diff 不起作用

在 grails 中迁移 mongodb 插件时发生异常

Grails 数据库迁移插件

Grails 数据库迁移插件 updateOnStart 不起作用