gpt4 book ai didi

grails - Groovy域对象列表未保存且未在 Controller 中排序

转载 作者:行者123 更新时间:2023-12-02 14:23:22 24 4
gpt4 key购买 nike

我有一个普通的域名类(class)。字段未映射到数据库。
Controller创建此类对象的列表并对其进行排序,然后将其发送到 View 。

instances = instances.sort() { it.part_number }

它没有排序。并且列表的打印成员对于整数字段返回0,对于字符串字段返回null。

打印第一个元素
println instances[0]

导致
mypackage.Order : (unsaved)

为什么未保存?并且无法排序?

如果将我的域类移至src / groovy作为POGO类,那将起作用。但是仅当我将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'

最佳答案

mypackage.Order : (unsaved)是Grails添加到域类中的实现toString()的结果-它是带有package和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",但这既不是Integer也不是String-只是一个可以同时转换为数据的对象。当您将属性类型定义为 String时,它起作用的原因是Groovy可以将任何内容存储在String属性中-它只是在上面调用 toString()。但是Groovy中不支持自动将恰好具有字符串化数字的 NodeChildren实例转换为该数字-您需要自己进行操作。但是,这与排序问题无关,因此需要在一个单独的问题中进行讨论。

关于grails - Groovy域对象列表未保存且未在 Controller 中排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27966531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com