我试图通过gson将我的bean转换为JSON。我的豆(日志)包括另一个bean(log)和第二个bean引用第一个bean。
@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);
您在日志和日志之间具有循环引用。
当您尝试将日志转换为JSON时,它将与它一起转换日志。但是日志的引用对日志和日志的引用是再次引用日志并继续进行。因此,堆栈将无限地生长并在某个点溢出。
从日志中删除日志引用,或添加一些注释以忽略
您必须将日志的'日志列表'取消,以避免无限循环。尝试这样
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create();
logs.getLogs.setLogList(null);
return gson.toJson(logs, Logs.class);
您正在获取日志,并且急切地您正在获取日志,显然它可以进行连续的检索,因此它将永远不会结束,所以我建议下面删除" @manytoone"日志实体中的关系。
@ManyToOne
@JoinColumn(name = "executionid")
private Logs logs;
我知道那是最糟糕的,但我找不到任何方法!
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(","));
}