0

Grails 2.2.2 アプリケーションでは、次のような 1 対多の関係があります。

親:

class Client {
    ...
    String name
    static hasMany = [modelFieldInstances: ModelFieldInstance]
    ...
}

子:

class ModelFieldInstance {
    ...
    String name
    String value
    static belongsTo = [client: Client]
    ...
}

ユーザーがクライアント レコードを含むスプレッドシートまたは csv をインポートできるように、データ インポーターを作成しようとしています。これを行うために、標準の scaffolding コントローラーClientのメソッドで新しいインスタンスを作成するときに、grails scaffolding が使用するパラメーターを調べました。save

Client問題は、インポーターで新しいインスタンスを作成して保存しようとすると、子ModelFieldInstanceが親への参照なしで保存されることですClient(ただし、Clientと はModelFieldInstanceすべて永続化されます)。

私のインポーターでは、次のようにデータ バインディングを行っています。

Client client = new Client()
client.modelFieldInstances = ListUtils.lazyList(new ArrayList(), {new ModelFieldInstance()} as org.apache.commons.collections.Factory)
client.properties = properties
...
client.save()

modelFieldInstancesGrails 足場コントローラーの動作とインポーターの動作の唯一の違いは、インポーターで最初にコレクションを .xml として設定していることだと思いLazyListます。ただし、LazyList割り当てを追加する前に、データバインディングは次のようなエラーで吹き飛ばされていました:

Invalid property 'modelFieldInstances[31]' of bean class [com.myapp.Client]: Illegal attempt to get property 'modelFieldInstances' threw exception; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property 'modelFieldInstances[31]' of bean class [com.myapp.Client]: Cannot get element with index 31 from Set of size 0, accessed using property path 'modelFieldInstances[31]'**

したがって、問題は、特定のプロパティ マップのスキャフォールディング コントローラーでデータ バインディングが機能することを確認できるのに、データ インポーターでデータ バインディングが機能しないのはなぜでしょうか。

4

1 に答える 1