Groovy域对象列表未保存且未在控制器中排序

时间:2015-01-15 15:11:15

标签: grails groovy gorm

我有一个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'

1 个答案:

答案 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实例转换为该数字 - 您需要自己完成。这与排序问题无关,因此需要在单独的问题中进行讨论。