2015-05-22 3 views
2

Имея ниже grails config: Datasource.Метод на классе [] использовался за пределами контроллера приложения 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" 
    } 
} 

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

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 правильно.

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

UPDATE
контроллер код:

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" 
     } 
    } 
} 

I доступ к контроллеру с помощью http://localhost:8080/myapp/foo/index
UPDATE
декларация столбца Blob неверно в моей оригинальный вопрос. Правильный вариант ниже:

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 
} 
+0

Можете ли вы предоставить реализацию контроллера? – saw303

+0

@ saw303 Обновлено сообщение с контрольным фрагментом –

+0

Как вы управляете Grails? – saw303

ответ

3

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

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" 
    } 
} 
0

Ваш класс домен 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() 

Надеется, что это помогает.

+0

По-прежнему такая же ошибка, когда я изменил тип свойства 'message' на String –

Смежные вопросы