2012-03-14 7 views
2

Grails 1.3.7Grailsデータバインディング - リストを持つコマンドオブジェクト

リストの内容を持つコマンドオブジェクトには問題があります。例コマンド:

class Tracker { 
    String name 
    String description 
    List<Unit> units = new ArrayList() 
} 

class Unit { 
    String name 
    Long unitMax 
    Long unitMin 
} 

作成TrackerのGSPにUnitフィールドがあります。一つの例:

<g:textField name="units[0].unitMax" value=""/> 

方法保存TrackerController:私は、コントローラを更新した場合、代わりに

def save = { Tracker trackerInstance -> 
    trackerInstance = trackingService.saveOrUpdateTracker(trackerInstance) 
} 

しかし、常にjava.lang.IndexOutOfBoundsException

を:

def save = { 
    Tracker trackerInstance = new Tracker() 
    trackerInstance.properties = params 
    .... 

その後グルーヴィー.lang.ReadOnlyPropertyException:readonlyプロパティを設定できません:class:com.redbrickのプロパティhealth.dto.Tracker アイデア?

GORMとCommandオブジェクトのバインドには違いがあるようです。

ユニットのPropertyEditorSupportを拡張して登録する必要があるのでしょうか?

-Todd

答えて

4

Grailsはrequesのからのデータで満たされる既存のリストを使用して、コマンドを、必要とします。

あなたは単位の正確な数を知っている場合は、次のことができ、3を言う:

class Tracker { 
    String name 
    String description 
    List<Unit> units = [new Unit(), new Unit(), new Unit()] 
} 

やGroovyのはListインターフェースはメソッドを持っている1.8.7以来のApache Commonsのコレクションから

import org.apache.commons.collections.ListUtils 
import org.apache.commons.collections.Factory 
class Tracker { 
    String name 
    String description 
    List<Unit> units = ListUtils.lazyList([], {new Unit()} as Factory) 
} 
6

をLazyListを使用withLazyDefaultと呼ばれ、Apacheコモンズの代わりに使用できます。ListUtils

List<Unit> units = [].withLazyDefault { new Unit() } 

存在しないインデックスでunitsにアクセスするたびに、新しいUnitインスタンスが作成されます。

詳細については、documentation of withLazyDefaultを参照してください。私は数日前にこのことについて小文字のblog postを書きました。

関連する問題