0

このバグは再帰バグのようです。会社がワークシートを要求し、それが再び会社を要求します。これにより、ドリフトが発生します。私はインターネットを検索し、これについてスタックオーバーフローを調べました。エラーが発生する理由を見つけましたが、解決策は常に独自のパーサーを作成するか、flexjsonなどを使用することです。これに対する解決策があるかどうかを知りたいだけです。プレイは非常に人気があり、確かに人々は1回の操作で投稿やコメントを取得しているので、そうする必要がありますか?

jsonパーサーを交換したり、独自のパーサーを作成したりせずに、これに対する解決策が必要です。

Company.java

package models;

import java.util.*;
import javax.persistence.*;

import play.db.jpa.*;

@Entity
public class Company extends Model {
    public String name;
    public String address;
    public String city;
    public String zipcode;
    public String country;
    public String phonenumber;
    public String website;
    public String footer;
    public String maincontactperson;
    public String email;
    public String password;
    public Blob logo;
    @OneToMany(mappedBy = "company", cascade = CascadeType.ALL, orphanRemoval = true, fetch=FetchType.EAGER)
    public List<Worksheet> worksheets;


    }

}

Worksheet.java

package models;

import java.util.*;
import javax.persistence.*;

import play.db.jpa.*;

@Entity
public class Worksheet extends Model {
    public String contactname;
    public String name;
    public String address;
    public String phonenumber;
    public String city;
    public String email;
    public String partnumber;
    @Lob
    public String partdescription;
    public String password;
    public Date due_date;
    public Date in_date;
    @Lob
    public String notes;
    @ManyToOne(cascade=CascadeType.ALL)
    public Company company;
...
}

私のコントローラーでは、これを実行するだけです:

List<Company> companies = Company.FindAll();
renderJSON(companies);

これは、ワークシートがない場合に機能しますが、ワークシートがあると、1マイルの長さのエラーメッセージでクラッシュします。これがそのトップです:

00:31:02,623 ERROR ~ 

@6cbn7gi1o
Internal Server Error (500) for request POST /companies/login

Execution exception
InvocationTargetException occured : null

play.exceptions.JavaExecutionException
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:239)
    at Invocation.HTTP Request(Play!)
Caused by: java.lang.reflect.InvocationTargetException
    at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:557)
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:508)
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:484)
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:479)
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161)
    ... 1 more
Caused by: java.lang.StackOverflowError
    at java.util.Date.getTimeImpl(Date.java:870)
    at java.util.Date.getTime(Date.java:866)
    at java.sql.Timestamp.getTime(Timestamp.java:126)
    at java.util.Calendar.setTime(Calendar.java:1076)
    at java.text.SimpleDateFormat.format(SimpleDateFormat.java:875)
    at java.text.SimpleDateFormat.format(SimpleDateFormat.java:868)
    at java.text.DateFormat.format(DateFormat.java:316)
    at com.google.gson.internal.bind.DateTypeAdapter.write(DateTypeAdapter.java:90)
    at com.google.gson.internal.bind.DateTypeAdapter.write(DateTypeAdapter.java:41)
    at com.google.gson.internal.bind.TypeAdapters$22$1.write(TypeAdapters.java:522)
    at com.google.gson.internal.bind.TypeAdapters$22$1.write(TypeAdapters.java:515)
....

    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195)
    at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:879)
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195)
4

2 に答える 2

3

私見これはバグではありません。モデルに再帰があり、フレームワークはモデルをどのようにシリアル化するかを自動的に知ることができません。

私は通常、@Exposeアノテーションを使用してこれを解決します。シリアル化されたJSONに表示するすべてのメンバーに追加し、次のようなヘルパーメソッドを作成します。

    Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
    String json = gson.toJson(your_model_instance);

オプションで、コメントで提案されているようにJsonSerializerインターフェースを実装することもできます。

于 2012-11-16T08:30:48.940 に答える
0

別の質問で、このクラスへのリンクを見つけました。これは、循環参照の問題をうまく解決しているようです(モデルクラスを変更しなくても)。

例については、リンクされた質問に対する承認済みの回答を参照してください。

于 2012-11-16T10:25:24.287 に答える