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