2

これらのドメインクラスが与えられた場合:

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]に変換できません:一致するエディターまたは変換戦略が見つかりません]

なぜこれが失敗するのですか、そしてそれを機能させる方法はありますか?

4

1 に答える 1

1

私はあなたに少し提案を与えることができます(=。params動作中のデバッグモードでチェックしてくださいupdate(コンソールで実行されるドメインクラスのビューとコントローラーを生成していない場合) 。IDのリストとしてそれを見つけるgenerate-all Personのを見てください。試してみてくださいparams.aliases同じ。

于 2012-08-08T19:51:28.650 に答える