class [] 上的方法在 Grails 应用程序控制器之外使用
Method on class [] was used outside of a Grails application controller
具有以下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"
}
}
域class:
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')
以上行失败并出现以下错误:
class [com.foo.bar.SpringMessage] 上的方法在 Grails 应用程序之外使用。如果 运行 在测试上下文中正确使用模拟 API 或 bootstrap Grails。
如何解决?谷歌搜索显示 grails "test" 相关帖子。但这不是测试代码。上面的 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 访问控制器
更新
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
}
您的域 class 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()
希望对您有所帮助。
问题是因为 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"
}
}
我刚刚 运行 进入这个问题。
在我的 DataSource.groovy 中,我将辅助数据源指定为 dataSource_mysql
,在我的域 class 映射块中,我也有同样的设置。结果在域 class 中我需要将数据源引用为 mysql
而没有 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"
}
}
域class:
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')
以上行失败并出现以下错误: class [com.foo.bar.SpringMessage] 上的方法在 Grails 应用程序之外使用。如果 运行 在测试上下文中正确使用模拟 API 或 bootstrap Grails。
如何解决?谷歌搜索显示 grails "test" 相关帖子。但这不是测试代码。上面的 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 访问控制器
更新
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
}
您的域 class 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()
希望对您有所帮助。
问题是因为 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"
}
}
我刚刚 运行 进入这个问题。
在我的 DataSource.groovy 中,我将辅助数据源指定为 dataSource_mysql
,在我的域 class 映射块中,我也有同样的设置。结果在域 class 中我需要将数据源引用为 mysql
而没有 dataSource_
.
进行此更改后,我可以从我的控制器调用域方法而不会引发此错误。