-1

I am trying to convert a a list Objects i received from the database to Json but i get when i try to convert.

java.lang.StackOverflowError: null
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243) ~[gson-2.8.0.jar:na]
at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:976) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243) ~[gson-2.8.0.jar:na]
at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:976) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243) ~[gson-2.8.0.jar:na]
at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:976) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243) ~[gson-2.8.0.jar:na]
at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:976) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243) ~[gson-2.8.0.jar:na]
at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:976) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243) ~[gson-2.8.0.jar:na]
at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:976) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) ~[gson-2.8.0.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125) ~[gson-2.8.0.jar:na]
at (and so on)

here is my code:

@RequestMapping(value = "/query/orders",method = RequestMethod.GET)
public String QueryOrderTable(HttpServletRequest request){

    DataTableRequest<Orders> dataTableInRQ = new DataTableRequest<Orders>(request);
    PaginationCriteria pagination = dataTableInRQ.getPaginationRequest();

    String baseQuery = "SELECT id as id, time as time, amount as amount, status as status, style as style, fashionbrand as fashionbrand, user_id as user_id, (SELECT COUNT(1) FROM ORDERS) AS totalrecords  FROM ORDERS";
    String paginatedQuery = AppUtil.buildPaginatedQuery(baseQuery, pagination);

    System.out.println(paginatedQuery);

    Query query = entityManager.createNativeQuery(paginatedQuery, Orders.class);

    @SuppressWarnings("unchecked")
    List<Orders> ordersList = query.getResultList();

    DataTableResults<Orders> dataTableResult = new DataTableResults<Orders>();
    dataTableResult.setDraw(dataTableInRQ.getDraw());
    dataTableResult.setListOfDataObjects(ordersList);
    if (!AppUtil.isObjectEmpty(ordersList)) {
        dataTableResult.setRecordsTotal(String.valueOf(ordersList.size())
        );
        if (dataTableInRQ.getPaginationRequest().isFilterByEmpty()) {
            dataTableResult.setRecordsFiltered(String.valueOf(ordersList.size()));
        } else {
            dataTableResult.setRecordsFiltered(String.valueOf(ordersList.size()));
        }
    }
    JSONSerializer serializer = new JSONSerializer();

    return serializer.deepSerialize(dataTableResult);
}

the idea is that i retrieve a list of Orderobjects from the database, pass it to the dataTableResult and send it to the front end to be displayed by Jquerydatatable, i get the lists, but when i try to Use GSON() to try and convert either the orederList or dataTableResult it throws an error.I Switched over to flexJson, which allowed me to convert the orderList to json but not the dataTableResult. Please can someone explain why this is happening.

this is my Order class and dataTableResult class respectively:

@Entity
public class Orders extends DefaultEntity {

  @Expose(serialize = false)
  @ManyToOne
  @JoinColumn(name = "fashionbrand")
  private FashionBrand fashionBrand;

  private double amount;

  @Enumerated(EnumType.STRING)
  @Column(name = "style")
  private Enum.ClothStyle clothStyle;

  @Expose(serialize = false)
  @OneToMany
  private List<ClothModel> clothModels = new ArrayList<>();

  @Enumerated(EnumType.STRING)
  private Enum.Status status;

  @Expose(serialize = false)
  @ManyToOne
  @JoinColumn(name = "user_id")
  private User user;
}

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;    
}

This is the ClothModel class:

@Entity
public class ClothModel extends DefaultEntity {

    private int quantity;

    private double amount;

    @Transient
    private String modelStructure;

    private String savedUrl;
}

And the FashionBrand Class:

@Entity
public class FashionBrand extends DefaultEntity {

    private String brandName;

    private String image;

    private String website;

    @Email
    private String email;

    private String password;

    private String phoneNumber;

    private String brandPhrase;

    @JsonIgnore
    @Transient
    private List<Rating> ratings = new ArrayList<>();

    private String location;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "pricing_id")
    private Pricing pricing;


    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "services_id")
    private Services services;

    @JsonIgnore
    @Transient
    private List<Orders> orders = new ArrayList<>();

    @JsonIgnore
    @Transient
    private List<Employee> employees = new ArrayList<>();
}

finally the default entity class :

@MappedSuperclass
public class DefaultEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(columnDefinition = "serial")
    private long id;

    @Column(name = "Time",columnDefinition= "TIMESTAMP WITH TIME ZONE")
    @Temporal(TemporalType.TIMESTAMP)
    private Date dateCreated;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public Date getDateCreated() {
        return dateCreated;
    }

    public void setDateCreated() {

        SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");

        dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

        try {
            dateCreated = dateFormat.parse(dateFormat.format(new Date()));
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
Sebastiaan van den Broek
  • 5,818
  • 7
  • 40
  • 73
Thanus
  • 411
  • 2
  • 8
  • 21

1 Answers1

1

This is most likely because you have a reference to FashionBrand in your Orders class, and a reference to Order in your FashionBrand class. While generating JSON, they keep referencing each other, leading to a stackoverflow. I realize there is a @JsonIgnore annotation on the field in FashionBrand but I'd still say that probably this annotation is being ignored. As far as I know this is a Jackson annotation but you seem to be using Google's GSON, which is not going to care about that annotation. It should be easy to debug this.

In your Orders class:

@Expose(serialize = false)
@ManyToOne
@JoinColumn(name = "fashionbrand")
private FashionBrand fashionBrand;

In your FashionBrand class:

@JsonIgnore
@Transient
private List<Orders> orders = new ArrayList<>();
Sebastiaan van den Broek
  • 5,818
  • 7
  • 40
  • 73