具有以下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
}
答案 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_
。
一旦进行了此更改,就可以从控制器调用域方法,而不会引发此错误。