2012-06-22 52 views
0

我有一個類,看起來像這樣:的Grails的GetProperties方法並不總是返回的屬性按正確的順序

class Foo { 
    name 
    description 

    static constraints = { 
     name() 
     description() 
    } 
} 

我想在Flexigrid加我的類的實例顯示。當數據發送到flexigrid時,它需要採用JSON或XML格式...我選擇了JSON。 Flexigrid期待它收到的JSON陣列具有以下格式:

{ 
    "page": "1", 
    "total": "1", 
    "rows": [ 
     { 
      "id": "1", 
      "cell": [ 
       "1", 
       "The name of Foo 1", 
       "The description of Foo 1" 
      ] 
     }, 
     { 
      "id": "2", 
      "cell": [ 
       "2", 
       "The name of Foo 2", 
       "The description of Foo 2" 
      ] 
     } 
    ] 
} 

爲了讓我Foo對象爲這種格式我做同樣的事情到這一點:

def foos = Foo.getAll(1, 2) 

def results = [:] 
results[ "page" ] = params.page 
results[ "total" ] = foos.size() 
results[ "rows" ] = [] 

for(foo in foos) { 
    def cell = [] 
    cell.add(foo.id) 

    foo.getProperties().each() { key, value -> // Sometimes get foo.getProperties().each() returns foo.description then foo.name instead of foo.name then foo.description as desired. 
     cell.add(value.toString()) 
    } 

    results[ "rows" ].add([ "id": foo.id, "cell": cell ]) 
} 

render results as JSON 

的問題是,每過一段時間foo.getProperties().each()返回foo.description然後foo.name導致foo.description被置於我的flexigrid的名稱列中,foo.name被置於我的flexigrid的描述列中以用於特定行。

我試過在Foo域類中指定約束,所以getProperties會以正確的順序返回,但它不起作用。 如何確保getProperties以可預測的順序返回屬性?

這是我解決了這個問題issuse:

def items = Foo.getAll() 

for(item in items) { 
    def cell = [] 
    cell.add(item.id) 
    Foo.constraints.each() { key, value -> 
     def itemValue = item.getProperty(key) 
     if(!(itemValue instanceof Collection)) { 
      cell.add(itemValue.toString()) 
     } 
    } 
} 

所以Foo.constraints得到映射約束的每個約束的Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry一個實例。經過測試,我發現這張地圖總是按照我輸入的順序返回我的Foo靜態約束(也由Ian確認)。現在只有屬於Foo.constraintsitem的屬性將被添加到flexigrid的cell

+0

爲什麼要投票? – ubiquibacon

回答

2

我不認爲foo.getProperties()保證任何關於排序。但Foo.constraints在運行時被覆蓋,不返回原始閉包,而是的ConstrainedProperty對象,並且此映射中的鍵保證與約束閉包的順序相同(這是腳手架如何使用約束命令定義在腳手架視圖中顯示字段的順序)。所以你可以做點像

def props = [:] // [:] declares a LinkedHashMap, so order-preserving 
Foo.constraints.each { k, v -> 
    props[k] = foo."${k}" 
} 
0

foo.getProperties().sort()或者如果沒有好的方法來按您需要的順序對屬性進行排序,您總是可以自己定義列表中的屬性順序來迭代。

def properties = ['name', 'description'] 
properties.each { 
    cell.add(foo."$it") 
} 
+0

我希望能夠按照我指定的順序對屬性進行排序,它們應該列在域類約束中。調用Foo.constraints返回'Collections $ UnmodifiableMap $ UnmodifiableEntrySet $ UnmodifiableEntry'的一個實例,但我不知道這些條目是否總是按照我在域類中指定的順序。 – ubiquibacon

相關問題