类[]的方法在Grails应用程序控制器之外使用

时间:2015-05-22 04:14:26

标签: grails gorm grails-2.0 grails-domain-class grails-2.3

具有以下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运行。

如何解决这个问题?谷歌搜索显示grails&#34;测试&#34;相关文章。但这不是测试代码。上面的findBy方法是从grails控制器调用的。 我正在使用grails 2.3.3,不幸的是现在无法升级到最新版本。

更新
控制器代码:

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访问控制器
更新
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
}

3 个答案:

答案 0 :(得分:3)

问题是因为DataSource.groovy中的拼写错误: dataSource字应该有&#39; S&#39;大写。让人惊讶。 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"
    }
}

答案 1 :(得分:0)

您的域类SpringMessage使用org.springframework.integration.Message作为域属性message。有错误尝试指示org.springframework.integration.Message不是Grails域对象,并且不能映射到数据库。

您需要引入一个包含org.springframework.integration.Message实例相关数据的域对象。 Probaly你试图存储Spring 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
  String message // use a String instead of the message instance
  Date createdDate
}

然后将有效负载设置为SpringMessage

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

希望这有帮助。

答案 2 :(得分:0)

我刚遇到这个问题。

在我的DataSource.groovy中,我将辅助数据源指定为dataSource_mysql,在我的域类映射块中,我将其指定为相同。事实证明,在域类中,我需要将数据源引用为mysql,而没有dataSource_

一旦进行了此更改,就可以从控制器调用域方法,而不会引发此错误。