带有数据库迁移插件的 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 的哪个插件/模块?