Groovy 域对象列表未保存且未在控制器中排序
Groovy List of domain object not saved and not sorted in controller
我有一个 groovy 域 class。字段未映射到数据库。
控制器创建此类对象的列表并在发送到视图之前对其进行排序。
instances = instances.sort() { it.part_number }
它没有排序。并打印列表成员 returns 整数字段为 0,字符串字段为 null。
打印第一个元素
println instances[0]
导致
mypackage.Order : (unsaved)
为什么没有保存?并且无法排序?
如果我将我的域 class 移动到 src/groovy 作为 POGO class,它会起作用。但只有当我将 part_number 声明为 String 时。如果 part_number 是整数。它会崩溃。
| Error 2015-01-15 09:17:14,771 [http-bio-8080-exec-2] ERROR errors.GrailsExceptionResolver - GroovyCastException occurred when processing request: [GET] myapp/showInstances - parameters:
sort: part_number
order: asc
Cannot cast object '259042' with class 'groovy.util.slurpersupport.NodeChildren' to class 'java.lang.Integer'. Stacktrace follows:
Message: Cannot cast object '259042' with class 'groovy.util.slurpersupport.NodeChildren' to class 'java.lang.Integer'
mypackage.Order : (unsaved)
是 Grails 添加到域 classes 的 toString()
的实现结果 - 它是带有包的完整 class 名称和 id
,或者字符串 (unsaved)
如果它不是持久实例。但除了告诉您 class 名称和没有 ID 之外,它没有指示 任何 其他字段和属性的内容。
该列表很可能已排序,但您没有显示该实例的相关数据。试试这个:
println instances[0].dump()
或更直接
println instances[0].part_number
还可以考虑实现一个显示 class 数据的 toString()
方法,例如
String toString() {
part_number
}
请注意,Grails 域 classes 滥用了 "domain" 概念并且始终保持不变。如果你有一个 POGO class,你想将其用作应用程序域的一部分(一般意义上),它们应该在 src/groovy
中(或 POJOs 在 src/java
中)。当您更改为它时,将不会有任何 Grails 添加的 toString()
方法,因此您将获得所有 classes 获得的默认实现(例如 mypackage.Order@48c02bce
,class 包含包的名称和十六进制形式的 hashCode 值)
编辑 - 根据更新的问题进行更新
您的 XML 解析代码有问题。您正在存储一个 groovy.util.slurpersupport.NodeChildren
实例,它具有 "259042"
的 toString()
结果,但它既不是 Integer 也不是 String - 只是一个包含可以转换为两者的数据的对象。当您将 属性 类型定义为 String
时它起作用的原因是 Groovy 可以将任何内容存储在字符串 属性 中 - 它只是调用 toString()
它。但是 Groovy 不支持自动将恰好具有字符串化数字的 NodeChildren
实例转换为该数字 - 你需要自己做。不过,这与排序问题无关,因此需要在单独的问题中讨论。
我有一个 groovy 域 class。字段未映射到数据库。 控制器创建此类对象的列表并在发送到视图之前对其进行排序。
instances = instances.sort() { it.part_number }
它没有排序。并打印列表成员 returns 整数字段为 0,字符串字段为 null。
打印第一个元素
println instances[0]
导致
mypackage.Order : (unsaved)
为什么没有保存?并且无法排序?
如果我将我的域 class 移动到 src/groovy 作为 POGO class,它会起作用。但只有当我将 part_number 声明为 String 时。如果 part_number 是整数。它会崩溃。
| Error 2015-01-15 09:17:14,771 [http-bio-8080-exec-2] ERROR errors.GrailsExceptionResolver - GroovyCastException occurred when processing request: [GET] myapp/showInstances - parameters:
sort: part_number
order: asc
Cannot cast object '259042' with class 'groovy.util.slurpersupport.NodeChildren' to class 'java.lang.Integer'. Stacktrace follows:
Message: Cannot cast object '259042' with class 'groovy.util.slurpersupport.NodeChildren' to class 'java.lang.Integer'
mypackage.Order : (unsaved)
是 Grails 添加到域 classes 的 toString()
的实现结果 - 它是带有包的完整 class 名称和 id
,或者字符串 (unsaved)
如果它不是持久实例。但除了告诉您 class 名称和没有 ID 之外,它没有指示 任何 其他字段和属性的内容。
该列表很可能已排序,但您没有显示该实例的相关数据。试试这个:
println instances[0].dump()
或更直接
println instances[0].part_number
还可以考虑实现一个显示 class 数据的 toString()
方法,例如
String toString() {
part_number
}
请注意,Grails 域 classes 滥用了 "domain" 概念并且始终保持不变。如果你有一个 POGO class,你想将其用作应用程序域的一部分(一般意义上),它们应该在 src/groovy
中(或 POJOs 在 src/java
中)。当您更改为它时,将不会有任何 Grails 添加的 toString()
方法,因此您将获得所有 classes 获得的默认实现(例如 mypackage.Order@48c02bce
,class 包含包的名称和十六进制形式的 hashCode 值)
编辑 - 根据更新的问题进行更新
您的 XML 解析代码有问题。您正在存储一个 groovy.util.slurpersupport.NodeChildren
实例,它具有 "259042"
的 toString()
结果,但它既不是 Integer 也不是 String - 只是一个包含可以转换为两者的数据的对象。当您将 属性 类型定义为 String
时它起作用的原因是 Groovy 可以将任何内容存储在字符串 属性 中 - 它只是调用 toString()
它。但是 Groovy 不支持自动将恰好具有字符串化数字的 NodeChildren
实例转换为该数字 - 你需要自己做。不过,这与排序问题无关,因此需要在单独的问题中讨论。