2017-02-24 16 views
0

私のbeanをGson経由でjsonに変換しようとしています。私のBean(Logs)には別のBean(Log)と、最初のBeanへの2番目のBean参照が含まれています。JavaでリファレンスBeanとBeanをjsonに変換するには?

@Entity 
@Table(name = "t_logs") 
public class Logs { 

    @Id 
    @Column(name = "executionid") 
    private String executionId; 

    @Column(name = "sentdate") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date sentDate; 

    @Column(name = "sent") 
    private boolean sent; 

    @OneToMany(mappedBy = "logs", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    private List<Log> logList;} 


@Entity 
@Table(name = "t_log") 
public class Log { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    private long id; 

    @ManyToOne 
    @JoinColumn(name = "executionid") 
    private Logs logs; 

    @Column(name = "startdate") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date startDate; 

    @Column(name = "enddate") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date endDate; 
    } 

私がJson形式を変換しようとすると、上記のようなエラーが発生します。私はこれがサイクルだと思いますが、どのように私はそれを解決することができます java.lang.StackOverflowErrorを

、私はあなたがログとログの間で循環参照を持っている

 Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create(); 
     return gson.toJson(logs, Logs.class); 

答えて

0

私はそれが最悪であることを知っていますが、私はどんな方法も見つけられませんでした!

private String convertToMyJSON(Logs logs) { 

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 

    String jsonObject = "{" 
      + "\"executionId\":\"" + logs.getExecutionId() + "\"," 
      + "\"startDate\":\"" + sdf.format(logs.getStartDate()) + "\"," 
      + "\"logList\":[" + getLogString(logs) + "]" 
      + "}"; 

    return jsonObject; 
} 

private String getLogString(Logs logs) { 

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 

    String logString = ""; 

    for (Log l : logs.getLogList()) { 

     logString = logString 
       + "{" 
       + "\"id\":" + l.getId() + "," 
       + "\"executionId\":\"" + logs.getExecutionId() + "\"," 
       + "\"startDate\":\"" + sdf.format(l.getStartDate()) + "\"," 
       + "\"endDate\":\"" + sdf.format(l.getEndDate()) + "\"," 
       + "},"; 
    } 

    return logString.substring(0, logString.lastIndexOf(",")); 
} 
0

を知りません。

ログをJsonとして変換しようとすると、ログが変換され、参照されたものとなります。しかし、ログにはログへの参照があり、ログには再びログへの参照があります。スタックは無限に成長し、ある時点でオーバーフローします。

どちらかが無限ループを避けるために、ログの「logList」を無効にする必要があり、ログからのログの参照を削除するか、それを

+0

あなたはそれを無視するためのアノテーションを提案できますか? –

+0

Gsonのフィールドを除外するには、ここをクリックしてくださいhttp://howtoprogram.xyz/2016/10/16/ignore-or-exclude-field-in-gson/ –

+0

@Selvakumarありがとうございますが、私は提出が必要です私があなたの提案したlog.executionid setted nullを試したときに、実行beanのbean(executeIdのため)に –

0

を無視するように、いくつかの注釈を追加します。あなたがしてログを取得していると熱心にあなたはそれが終わることはありませんので、そのは、連続的検索を行って、明らかに、あまりにもログを取得しているので、私は以下のため、「@ManyToOne」を削除するために示唆されています。この

Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create(); 
logs.getLogs.setLogList(null); 
return gson.toJson(logs, Logs.class); 
+0

を入れてください。そうすれば、サーバー側のdbではこれらのデータexecutionidはnullになります。 (参照なし) –

0

のようにしてみてください ログエンティティ内の関係。

@ManyToOne 
@JoinColumn(name = "executionid") 
private Logs logs; 
+0

ManyToOneを削除したとき、上記のようなエラーが出ました。 initメソッドの呼び出しに失敗しました。ネストされた例外はorg.hibernate.MappingExceptionです:型を判別できませんでした:net.mycompany.model.Logs –

関連する問題