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 实例转换为该数字 - 你需要自己做。不过,这与排序问题无关,因此需要在单独的问题中讨论。