Как конвертировать 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, он преобразует журнал так же, как и его ссылки. Но в журнале есть ссылка на журналы, а в журналах есть ссылка, чтобы снова войти и продолжить. Так что стек будет бесконечно расти и переполняться в одной точке.

Удалите ссылку "Журналы" из журнала или добавьте аннотации, чтобы игнорировать ее.

Другие вопросы по тегам