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()
modelFieldInstances
Grails 足場コントローラーの動作とインポーターの動作の唯一の違いは、インポーターで最初にコレクションを .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]'**
したがって、問題は、特定のプロパティ マップのスキャフォールディング コントローラーでデータ バインディングが機能することを確認できるのに、データ インポーターでデータ バインディングが機能しないのはなぜでしょうか。