Как конвертировать bean со ссылкой на JSON в Java?
Я пытаюсь преобразовать мой бин в JSON через Gson. Мой бин (Журналы) включает в себя еще один бин (Журнал) и ссылку второго бина на первый бин.
@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.StackruError
Я думаю, что это цикл, но как я могу решить это, я не знаю,
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create();
return gson.toJson(logs, Logs.class);
4 ответа
Я знаю, что это худшее, но я не мог найти никакого пути!
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(","));
}
Вы извлекаете журналы и, с нетерпением, тоже извлекаете журнал, очевидно, он выполняет непрерывный поиск, поэтому он никогда не закончится, поэтому я предлагаю удалить "@ManyToOne" для отношения ниже в сущности журнала.
@ManyToOne
@JoinColumn(name = "executionid")
private Logs logs;
Вы должны обнулить "logList" журналов, чтобы избежать бесконечного цикла. попробуй вот так
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create();
logs.getLogs.setLogList(null);
return gson.toJson(logs, Logs.class);
У вас есть круговая ссылка между журналами и журналом.
Когда вы пытаетесь конвертировать журналы как Json, он преобразует журнал так же, как и его ссылки. Но в журнале есть ссылка на журналы, а в журналах есть ссылка, чтобы снова войти и продолжить. Так что стек будет бесконечно расти и переполняться в одной точке.
Удалите ссылку "Журналы" из журнала или добавьте аннотации, чтобы игнорировать ее.