これらのドメインクラスが与えられた場合:
class Person {
Long id
String name
static hasMany = [aliases: PersonAlias]
}
class PersonAlias {
Person person
Long id
String name
}
JSONランドを介して簡単なラウンドトリップロード/保存を実行しようとしています。
Person p = Person.get(20005353);
def json = p as JSON
def str = json as String
def map = JSON.parse(str)
p.properties = map
p.save(flush:true)
このJSONを生成します
{
"id": 20005353,
"name": "John Smith",
"class": "Person",
"aliases":
[
{
"class": "PersonAlias",
"id": 99,
"name": "J. Smith"
}
]
}
そして、このエラーで失敗します:
grails.validation.ValidationErrors:1エラーフィールド'aliases'のオブジェクト'heavymeta.Person'のフィールドエラー:拒否された値[[]]; コード[typeMismatch.heavymeta.Person.aliases、typeMismatch.aliases、typeMismatch.java.util.Set、typeMismatch]; 引数[org.springframework.context.support.DefaultMessageSourceResolvable:コード[heavymeta.Person.aliases、aliases]; 引数[]; デフォルトメッセージ[エイリアス]]; デフォルトメッセージ[タイプ'org.codehaus.groovy.grails.web.json.JSONArray'のプロパティ値をプロパティ'エイリアス'に必要なタイプ'java.util.Set'に変換できませんでした。ネストされた例外はjava.lang.IllegalStateExceptionです:プロパティ'aliases [0]'のタイプ[java.util.LinkedHashMap]の値を必要なタイプ[heavymeta.PersonAlias]に変換できません:一致するエディターまたは変換戦略が見つかりません]
なぜこれが失敗するのですか、そしてそれを機能させる方法はありますか?