Метод класса [] использовался вне контроллера приложений Grails.

Имея ниже конфигурацию Grails: Datasource.

environments {
development {
    dataSource {
        dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', ''
        url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
    }

    datasource_staging_oracle {
        dbCreate = "none"
        url = "jdbc:oracle:thin:@//myoraclehost:1521/DBNAME"
        driverClassName = "oracle.jdbc.OracleDriver"
        username = "username"
        password = "password"
    }
}

Класс домена:

import org.springframework.integration.Message

class SpringMessage {

    static mapping = {
        datasource 'staging_oracle'
        message type: 'blob', column: 'message_bytes'
        createdDate type: Date, column: 'created_date'
    }
    static constraints = {
    }

    String messageId
    Message<?> message
    Date createdDate
}

Внутри контроллера извлечение записей с помощью:

SpringMessage springMessage = SpringMessage.findByMessageId('messsage_id_value')

Вышеприведенная строка завершается с ошибкой ниже: Метод класса [com.foo.bar.SpringMessage] использовался вне приложения Grails. При запуске в контексте теста с использованием API-интерфейса имитации или правильной начальной загрузки Grails.

Как это решить? Поиск в Google показывает сообщения, связанные с "тестом" Grails. Но это не тестовый код. Приведенный выше метод findBy вызывается из контроллера Grails. Я использую Grails 2.3.3 и, к сожалению, пока не могу обновиться до последней версии Grails.

ОБНОВЛЕНИЕ
Код контроллера:

class FooController {
    def index() {
        foo2()
    }
    private def foo2() {
        SpringMessage springMessage = SpringMessage.findByMessageId('my_message_id') //This line blowsup
        if ( springMessage) {
            println springMessage.createdDate
        } else {
            println "not found"
        }
    }
}

Я получаю доступ к контроллеру, используя http://localhost:8080/myapp/foo/index
ОБНОВЛЕНИЕ
Неверное объявление столбца больших двоичных объектов в исходном вопросе. Правильная версия ниже:

class SpringMessage {

    static mapping = {
        datasource 'staging_oracle'
        message type: 'blob', column: 'message_bytes'
        createdDate type: Date, column: 'created_date'
    }
    static constraints = {
    }

    String messageId
    Blob message
    Date createdDate
}

person suman j    schedule 22.05.2015    source источник
comment
Можете ли вы предоставить реализацию контроллера?   -  person saw303    schedule 22.05.2015
comment
@saw303 saw303 Обновил сообщение с фрагментом контроллера.   -  person suman j    schedule 22.05.2015
comment
Как вы запускаете Grails?   -  person saw303    schedule 22.05.2015
comment
Это от Intellijj. Запустите Grails с аргументом run-app.   -  person suman j    schedule 22.05.2015
comment
Можете ли вы попробовать это из командной строки и добавить полную трассировку стека? запустить Grails Run-App из командной строки   -  person saw303    schedule 22.05.2015
comment
Решение найдено. Это уродливая опечатка в конфигурации источника данных.   -  person suman j    schedule 22.05.2015
comment
пожалуйста, предоставьте решение, чтобы ответить на ваш вопрос   -  person saw303    schedule 22.05.2015


Ответы (3)


Проблема связана с опечаткой в ​​DataSource.groovy: слово dataSource должно иметь букву «S» в верхнем регистре. Угу. Grails должен был предупредить об этом.

environments {
  development {
    dataSource {
        dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', ''
        url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
    }

    dataSource_staging_oracle {
        dbCreate = "none"
        url = "jdbc:oracle:thin:@//myoraclehost:1521/DBNAME"
        driverClassName = "oracle.jdbc.OracleDriver"
        username = "username"
        password = "password"
    }
}
person suman j    schedule 22.05.2015

Ваш класс домена SpringMessage использует org.springframework.integration.Message в качестве свойства домена message. Ошибка пытается указать, что org.springframework.integration.Message не является объектом домена Grails и не может быть сопоставлен с базой данных.

Вам нужно ввести объект домена, содержащий соответствующие данные вашего экземпляра org.springframework.integration.Message. Вероятно, вы пытаетесь сохранить полезную нагрузку сообщения интеграции Spring.

class SpringMessage {

  static mapping = {
    datasource 'staging_oracle'
    message type: 'blob', column: 'message_bytes'
    createdDate type: Date, column: 'created_date'
  }
  static constraints = {
  }

  String messageId
  String message // use a String instead of the message instance
  Date createdDate
}

а затем установите полезную нагрузку в SpringMessage

new SpringMessage(messageId: 'ID', message: message.payload, createdDate: new Date()).save()

Надеюсь это поможет.

person saw303    schedule 22.05.2015
comment
Все та же ошибка, когда я изменил тип свойства message на String - person suman j; 22.05.2015

Я только что столкнулся с этой проблемой.

В моем DataSource.groovy я указывал вторичный источник данных как dataSource_mysql, и в моем блоке сопоставления классов домена у меня было то же самое. Оказывается, в классе домена мне нужно было ссылаться на источник данных как просто mysql без dataSource_.

После внесения этого изменения я смог вызывать методы домена с моего контроллера без возникновения этой ошибки.

person Daniel Black    schedule 10.09.2020