Grails 3 с подключаемым модулем миграции базы данных: метод класса [com.mypackage.security.RequestMap] использовался вне приложения Grails

Я использую Grails 3.0.7 с подключаемым модулем database-migration. У меня есть супер простая миграция, с которой я не могу работать:

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, она отлично сохраняется. Я не уверен, в чем проблема.


person cloudwalker    schedule 20.10.2015    source источник
comment
Можете ли вы предоставить свою конфигурацию DataSource.groovy?   -  person Shashank Agrawal    schedule 04.11.2015
comment
Кроме того, какая у вас версия плагина hibernate?   -  person Shashank Agrawal    schedule 04.11.2015
comment
Вы используете плагин для Grails-3? Имейте в виду, что на странице https://grails.org/plugins/ находятся плагины для Grails 1 и 2. Готовые плагины для Grails-3 находятся здесь https://bintray.com/grails/plugins   -  person Piotr Chowaniec    schedule 06.11.2015


Ответы (2)


Плагин требует серьезной доработки, большая часть инструкции не работает.

Всегда используйте 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>
person igilfanov    schedule 04.11.2015
comment
Да, это то, что я в итоге сделал. Очень жаль, что плагин до сих пор в таком плохом состоянии. - person cloudwalker; 08.11.2015

Я часто использую оператор 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')
            """)
        }
    }
person biniam    schedule 06.11.2015