我有一个groovy域类。字段未映射到数据库。 Controller会在发送到视图之前创建此类对象的列表并对其进行排序。
instances = instances.sort() { it.part_number }
没有排序。并且列表的打印成员对整数字段返回0,对于字符串字段返回null。
打印第一个元素
println instances[0]
导致
mypackage.Order : (unsaved)
为什么没有保存?而不是可以排序?
如果我将我的域类作为POGO类移动到src / groovy,它会起作用。但只有当我将part_number声明为String时。如果part_number是Integer。它会崩溃。
| 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'
答案 0 :(得分:3)
mypackage.Order : (unsaved)
是Grails添加到域类的toString()
实现的结果 - 它是带有包的完整类名,id
或字符串(unsaved)
如果它不是一个持久的实例。但除了告诉你类名和没有id之外,它并不表示任何关于其他字段和属性的内容。
列表很可能已排序,但您没有显示该实例的相关数据。试试这个:
println instances[0].dump()
或更直接
println instances[0].part_number
还要考虑实现显示类数据的toString()
方法,例如
String toString() {
part_number
}
请注意,Grails域类滥用“域”概念并且始终具有持久性。如果您要将POGO类用作应用程序域的一部分(在一般意义上),则应该在src/groovy
(或src/java
中的POJO)中。当你改变它时,不会有任何Grails添加的toString()
方法,所以你将得到所有类得到的默认实现(例如mypackage.Order@48c02bce
,包含类和hashCode的类名十六进制形式的值)
编辑 - 根据更新的问题进行更新
您的XML解析代码很糟糕。您正在存储一个groovy.util.slurpersupport.NodeChildren
实例,其toString()
结果为"259042"
,但它既不是整数也不是字符串 - 只是一个具有可以转换为两者的数据的对象。将属性类型定义为String
时,它的工作原理是Groovy可以将任何内容存储在String属性中 - 它只需在其上调用toString()
即可。但是在Groovy中没有支持自动将恰好具有字符串化数字的NodeChildren
实例转换为该数字 - 您需要自己完成。这与排序问题无关,因此需要在单独的问题中进行讨论。