2

Grails 1.3.7

リストコンテンツを持つコマンドオブジェクトのデータバインディングに問題があります。コマンドの例:

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
   ....

次に、groovy.lang.ReadOnlyPropertyException:読み取り専用プロパティを設定できません:クラスのプロパティ:com.redbrickhealth.dto.Tracker何かアイデアはありますか?

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

たぶん、UnitのPropertyEditorSupportを拡張して登録する必要がありますか?

-トッド

4

2 に答える 2

6

Groovy 1.8.7 以降、ListインターフェイスwithLazyDefaultには apache commons の代わりに使用できるメソッドが呼び出されますListUtils

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

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

詳細については、withLazyDefault のドキュメントを参照してください。また、数日前にこれについての小さなブログ記事を書きました。

于 2013-09-21T09:15:40.003 に答える
4

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

ユニットの正確な数、たとえば 3 がわかっている場合は、次のことができます。

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

または、Apache Commons コレクションの LazyList を使用します

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)
}
于 2012-03-15T05:10:54.317 に答える