2015-01-15 37 views
1

我有一個groovy域類。字段未映射到數據庫。 控制器創建一個這樣的對象的列表,並在發送到視圖之前進行排序。Groovy未保存並未在控制器中排序的域對象列表

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

它沒有排序。列表的打印成員返回0表示整數字段,null表示字符串字段。

打印的第一個元素

println instances[0] 

導致

mypackage.Order : (unsaved) 

爲什麼它是未保存的?不可排序?

如果我將我的域類作爲POGO類移動到src/groovy,它會起作用。但只有當我將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' 

回答

3

mypackage.Order : (unsaved)toString()的實現,增加的Grails域類的結果 - 它是完整的類名包和id或字符串(unsaved)如果它不是一個持久化實例。但除了告訴你課程名稱和沒有ID,它不表示關於其他字段和屬性的內容的任何東西

該列表很可能已排序,但您沒有顯示該實例的相關數據。嘗試這個代替:

println instances[0].dump() 

或更直接地

println instances[0].part_number 

還考慮實施顯示類數據,例如一個toString()方法

String toString() { 
    part_number 
} 

請注意,Grails域類有點濫用「域」概念,並且始終存在。如果你有一個POGO類,你想用作你的應用程序域的一部分(一般意義上),它們應該在src/groovy(或POJO src/java)中。當你改變它的時候,不會有任何Grails添加的方法,所以你會得到所有類都得到的默認實現(例如類似[email protected],類名包含hashCode和十六進制形式的值)

編輯 - 根據更新後的問題更新

您的XML解析代碼不好。您正在存儲groovy.util.slurpersupport.NodeChildren實例,其toString()結果爲"259042",但這既不是整數也不是字符串 - 只是具有可以轉換爲兩者的數據的對象。當您將屬性類型定義爲String時,它的工作原理是Groovy可以在String屬性中存儲任何內容 - 它只是調用toString()。但是Groovy沒有支持自動將實際上已經有字符串數字的NodeChildren實例轉換爲該數字 - 您需要自己做。這與排序問題無關,因此需要在單獨的問題中討論。

+0

它部分工作。請參閱我更新後的帖子。 – johnsam 2015-01-15 16:22:25

+0

你是對的。一旦我將該字段轉換爲String並創建Integer對象,它就開始工作。這是一個單獨的問題。無論如何,它現在正在工作。謝謝! – johnsam 2015-01-15 17:06:51