1

PlayのrenderJSON関数を使用してユーザーオブジェクトをJSON形式でレンダリングしようとしています。ただし、これを呼び出すと、InvocationTargetException:nullエラーが発生します。

デバッグ中に、initial-data.ymlファイルでユーザーの誕生日に指定した値が原因であることがわかりました。それは次のとおりです。

User(bob):
  firstName: Bob
  lastName: Bobson
  dob: 1979-01-01

ただし、プログラムでUserを作成し、新しいDate()コンストラクターを使用してdobを設定すると、オブジェクトは問題なくレンダリングされます。dob: !!java.util.Date "1979-01-01"SnakeYMLのドキュメント(http://code.google.com/p/snakeyaml/wiki/Documentation#YAML_syntax )に記載されているように試しても役に立ちませんでした。

私はここで何が間違っているのですか?

4

1 に答える 1

3

ユーレカ!私はそれを持っている!無限のSO質問を約9時間読んだ後、私はついに私の厚い頭蓋骨を通り抜けました。エラーは日付形式ではなく、デフォルトのGsonレンダラーが次のような双方向の関係ではうまく機能しないためです。 @OneToManyおよび@ManyToOne。

私の解決策は?オブジェクトをJSONとしてレンダリングするときが来たら、関係の片側を「ミュート」します。ここにある情報を使用して:ユーザー定義の除外戦略私は次の解決策を考え出しました。

/***************** Models ****************/

class Person {
 @Expose
 public int age;
 @Expose
 public String name;
 @Expose
 @OneToMany(mappedBy="owner")
 public Dog dog;

 //Constructors and other code
}

class Dog {
 @Expose
 public String name;
 @ManyToOne(fetch=FetchType.Eager)
 public Person owner;

 //Constructor and other code
}


/**************Controller********************/

public class Application extends Controller {

 public static Gson gson = GsonBuilder.excludeFieldsWithoutExposeAnnotation().create;

 public static void allPersons() {
  List<Person> people = Person.findAll();
  renderJSON(gson.toJson(people));

 //Error should be taken care of
 }
}

@Exposeアノテーションを使用して、レンダリング時に双方向関係の片側をミュートすると、問題は確実に解決されました。ここで、この新しい半片側構造を回避する方法を理解する必要があります。

このヒントを見つける前に使用した別のライブラリはFlexJSONでした。片側を「ミュート」する必要がなく、双方向の関係でうまく機能するため、アプリケーションの後半でどのように処理されるかによっては、それに戻る可能性があります。また、(私にとっては)Gsonライブラリよりもエレガントです。

ですから、@emt14のすべての支援に感謝します。この投稿が他の人の助けになることを願っています。

于 2013-01-22T14:22:41.683 に答える