gson.toJson()抛出StackOverflowError并且我没有循环依赖

时间:2018-10-13 12:41:59

标签: spring-boot

我正在尝试生成JSON

    Gson gson = new Gson();
String json = gson.toJson(item);

但是每次我尝试不断出现stackoverflow错误:

java.lang.StackOverflowError: null
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:239)
at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:968)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:112)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:239)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:112)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:239)
at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:968)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:112)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:239)

这是由于我尝试将包含Transactions.class列表作为其属性字段的DataTableResults类转换为字符串引起的。

DataTableResult类如下所示:

    public class DataTableResults<T> {

    /** The draw. */
    private String draw;

    /** The records filtered. */
    private String recordsFiltered;

    /** The records total. */

    private String recordsTotal;

    /** The list of data objects. */
    @SerializedName("data")
    List<T> listOfDataObjects;

    /**
     * Gets the draw.
     *
     * @return the draw
     */
    public String getDraw() {
        return draw;
    }

    /**
     * Sets the draw.
     *
     * @param draw the draw to set
     */
    public void setDraw(String draw) {
        this.draw = draw;
    }

    /**
     * Gets the records filtered.
     *
     * @return the recordsFiltered
     */
    public String getRecordsFiltered() {
        return recordsFiltered;
    }

    /**
     * Sets the records filtered.
     *
     * @param recordsFiltered the recordsFiltered to set
     */
    public void setRecordsFiltered(String recordsFiltered) {
        this.recordsFiltered = recordsFiltered;
    }

    /**
     * Gets the records total.
     *
     * @return the recordsTotal
     */
    public String getRecordsTotal() {
        return recordsTotal;
    }

    /**
     * Sets the records total.
     *
     * @param recordsTotal the recordsTotal to set
     */
    public void setRecordsTotal(String recordsTotal) {
        this.recordsTotal = recordsTotal;
    }

    /**
     * Gets the list of data objects.
     *
     * @return the listOfDataObjects
     */
    public List<T> getListOfDataObjects() {
        return listOfDataObjects;
    }

    /**
     * Sets the list of data objects.
     *
     * @param listOfDataObjects the listOfDataObjects to set
     */
    public void setListOfDataObjects(List<T> listOfDataObjects) {
        this.listOfDataObjects = listOfDataObjects;
    }

}

而Transactions.class看起来像这样

    @Entity
@Table(name = "TRANS")
public class Transactions extends DefaultEntity {

    public enum TRANSACTIONTYPE{WITHDRAW, DEPOSIT, WIN, LOSS}

    @ManyToOne(targetEntity = User.class)
    @JoinColumn(name="player")
    private User player;

    private double amount;

    @Enumerated(EnumType.STRING)
    private TRANSACTIONTYPE transactiontype;

    private String referenceID;

    private String detail;



    private String token;


    public TRANSACTIONTYPE getTransactiontype() {

        return transactiontype;

    }

    public Transactions setTransactiontype(TRANSACTIONTYPE transactiontype) {

        this.transactiontype = transactiontype;

        return this;
    }



    public double getAmount() {
        return amount;
    }

    public Transactions setAmount(double amount) {
        this.amount = amount;
        return this;
    }

    public String getReferenceID() {

        return referenceID;
    }

    public Transactions setReferenceID(String referenceID) {

        this.referenceID = referenceID;

        return this;

    }

    public String getDetail() {

        return detail;

    }

    public Transactions setDetail(String detail) {

        this.detail = detail;

        return this;
    }

    public String getToken() {

        return token;

    }

    public Transactions setToken(String token) {

        this.token = token;

        return this;

    }


    public User getPlayer() {
        return player;
    }

    public Transactions setPlayer(User player) {
        this.player = player;
        return this;
    }
}

根据此post,它应该是由循环依赖引起的,但就我而言,这不是因为我没有一个。还有什么可能导致这种错误?

1 个答案:

答案 0 :(得分:0)

您应该删除扩展DefaultEntity,不需要它,并且可能带来循环依赖。

您还与User有@ManyToOne关系,如果User也有对Transactions的引用,则可能导致循环依赖。 如果两个部分都包含它,则应至少在一部分上进行瞬态化,以将其排除在序列化之外。