I don't understand this error I'm getting, it has bee very frustating... I'm trying to use DataTables to display the data from to tables with oneToMany relationship, the only way the data is displayed in the view is by setting to null the relationship, that way the error above disappears but then I don't know how to display the data as I need to. Thanks in advance.
In user:
@JoinColumn(name = "id_rol", referencedColumnName = "id_rol", foreignKey = @ForeignKey(name = "fk_di"))
@ManyToOne(optional = false)
private Rol rol;
@GetMapping("/users/pag")
@ResponseBody
public String usersPaginate(HttpServletRequest request, HttpServletResponse response) {
DataTableRequest<User> dataTableInRQ = new DataTableRequest<User>(request);
PaginationCriteria pagination = dataTableInRQ.getPaginationRequest();
String baseQuery = "SELECT id_user, username, name, lastname, password, id_rol, (SELECT COUNT(1) FROM user) AS total_records FROM user ORDER BY lastname ASC";
String paginatedQuery = AppUtil.buildPaginatedQuery(baseQuery, pagination);
Query query = entityManager.createNativeQuery(paginatedQuery, User.class);
@SuppressWarnings("unchecked")
List<User> usersList = query.getResultList();
/*
for (int i = 0; i<usersList.size(); i++){
usersList.get(i).setRol(null);
}*/
DataTableResults<User> dataTableResult = new DataTableResults<User>();
dataTableResult.setDraw(dataTableInRQ.getDraw());
dataTableResult.setListOfDataObjects(usersList);
if (!AppUtil.isObjectEmpty(usersList)) {
dataTableResult.setRecordsTotal(usersList.get(0).getTotalRecords().toString());
if (dataTableInRQ.getPaginationRequest().isFilterByEmpty()) {
dataTableResult.setRecordsFiltered(usersList.get(0).getTotalRecords().toString());
} else {
dataTableResult.setRecordsFiltered(Integer.toString(usersList.size()));
}
}
return new Gson().toJson(dataTableResult);
}
$(document)
.ready(
function() {
var table = $('#paginatedTable')
.DataTable(
{
initComplete : function() {
var input = $(
'.dataTables_filter input')
.unbind(), self = this
.api(), $searchButton = $(
'#search')
.click(
function() {
self
.search(
input
.val())
.draw();
})
},
"processing" : true,
"serverSide" : true,
"pageLength" : 10,
"lengthChange" : false,
"columnDefs" : [
{
targets : '_all',
orderable : false
},
{
targets : [ 0, 3, 4, 5, 6 ],
"className" : "text-center"
},
{
targets : [ 3, 4, 5, 6, 7 ],
searchable : false
},
{
targets : [ 6 ],
render : function(data,
type, row) {
return data == true ? 'Habilitado'
: 'Deshabilitado'
}
},
{
targets : [ 4 ],
render : function(data,
type, row) {
return moment(data)
.format(
"DD/MM/YYYY");
}
},
{
targets : [ 7 ],
data : "idUser",
render : function(data,
type, row, meta) {
return '<div class="btn-group"><a href="/users/ed/'
+ data
+ '"><img class="btnEdit" src="/images/edit.png"></a></div>';
}
} ],
"ajax" : {
"url" : "/users/pag",
"data" : function(data) {
}
},
"columns" : [ {
"data" : "username"
}, {
"data" : "lastname"
}, {
"data" : "name"
}, {
"data" : "rol.tipoRol",
render : function(data, type, row) {
return data || '';
}
}]
});
});
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.StackOverflowError
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:982) ~[spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) ~[spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) [spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) [spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) [tomcat-embed-core-8.5.16.jar:8.5.16]
2018-01-18 00:00:11.508 ERROR 9160 --- [nio-8091-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.StackOverflowError] with root cause
java.lang.StackOverflowError: null
at java.util.Calendar.get(Calendar.java:1826) ~[na:1.8.0_144]
at java.text.SimpleDateFormat.subFormat(SimpleDateFormat.java:1119) ~[na:1.8.0_144]
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:966) ~[na:1.8.0_144]
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:936) ~[na:1.8.0_144]
at java.text.DateFormat.format(DateFormat.java:345) ~[na:1.8.0_144]
I don't understand this error I'm getting, it has bee very frustating... I'm trying to use DataTables to display the data from to tables with oneToMany relationship, the only way the data is displayed in the view is by setting to null the relationship, that way the error above disappears but then I don't know how to display the data as I need to. Thanks in advance.
In user:
@JoinColumn(name = "id_rol", referencedColumnName = "id_rol", foreignKey = @ForeignKey(name = "fk_di"))
@ManyToOne(optional = false)
private Rol rol;
@GetMapping("/users/pag")
@ResponseBody
public String usersPaginate(HttpServletRequest request, HttpServletResponse response) {
DataTableRequest<User> dataTableInRQ = new DataTableRequest<User>(request);
PaginationCriteria pagination = dataTableInRQ.getPaginationRequest();
String baseQuery = "SELECT id_user, username, name, lastname, password, id_rol, (SELECT COUNT(1) FROM user) AS total_records FROM user ORDER BY lastname ASC";
String paginatedQuery = AppUtil.buildPaginatedQuery(baseQuery, pagination);
Query query = entityManager.createNativeQuery(paginatedQuery, User.class);
@SuppressWarnings("unchecked")
List<User> usersList = query.getResultList();
/*
for (int i = 0; i<usersList.size(); i++){
usersList.get(i).setRol(null);
}*/
DataTableResults<User> dataTableResult = new DataTableResults<User>();
dataTableResult.setDraw(dataTableInRQ.getDraw());
dataTableResult.setListOfDataObjects(usersList);
if (!AppUtil.isObjectEmpty(usersList)) {
dataTableResult.setRecordsTotal(usersList.get(0).getTotalRecords().toString());
if (dataTableInRQ.getPaginationRequest().isFilterByEmpty()) {
dataTableResult.setRecordsFiltered(usersList.get(0).getTotalRecords().toString());
} else {
dataTableResult.setRecordsFiltered(Integer.toString(usersList.size()));
}
}
return new Gson().toJson(dataTableResult);
}
$(document)
.ready(
function() {
var table = $('#paginatedTable')
.DataTable(
{
initComplete : function() {
var input = $(
'.dataTables_filter input')
.unbind(), self = this
.api(), $searchButton = $(
'#search')
.click(
function() {
self
.search(
input
.val())
.draw();
})
},
"processing" : true,
"serverSide" : true,
"pageLength" : 10,
"lengthChange" : false,
"columnDefs" : [
{
targets : '_all',
orderable : false
},
{
targets : [ 0, 3, 4, 5, 6 ],
"className" : "text-center"
},
{
targets : [ 3, 4, 5, 6, 7 ],
searchable : false
},
{
targets : [ 6 ],
render : function(data,
type, row) {
return data == true ? 'Habilitado'
: 'Deshabilitado'
}
},
{
targets : [ 4 ],
render : function(data,
type, row) {
return moment(data)
.format(
"DD/MM/YYYY");
}
},
{
targets : [ 7 ],
data : "idUser",
render : function(data,
type, row, meta) {
return '<div class="btn-group"><a href="/users/ed/'
+ data
+ '"><img class="btnEdit" src="/images/edit.png"></a></div>';
}
} ],
"ajax" : {
"url" : "/users/pag",
"data" : function(data) {
}
},
"columns" : [ {
"data" : "username"
}, {
"data" : "lastname"
}, {
"data" : "name"
}, {
"data" : "rol.tipoRol",
render : function(data, type, row) {
return data || '';
}
}]
});
});
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.StackOverflowError
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:982) ~[spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) ~[spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) [spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) [spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) [tomcat-embed-core-8.5.16.jar:8.5.16]
2018-01-18 00:00:11.508 ERROR 9160 --- [nio-8091-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.StackOverflowError] with root cause
java.lang.StackOverflowError: null
at java.util.Calendar.get(Calendar.java:1826) ~[na:1.8.0_144]
at java.text.SimpleDateFormat.subFormat(SimpleDateFormat.java:1119) ~[na:1.8.0_144]
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:966) ~[na:1.8.0_144]
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:936) ~[na:1.8.0_144]
at java.text.DateFormat.format(DateFormat.java:345) ~[na:1.8.0_144]
Share
Improve this question
edited Jan 18, 2018 at 6:49
Kmtasia
asked Jan 18, 2018 at 6:35
KmtasiaKmtasia
681 gold badge2 silver badges10 bronze badges
1
- Its a StackOverflowError You came to the right place my friend :-D – sparker Commented Jul 28, 2022 at 12:10
1 Answer
Reset to default 3If anyone is interested in the solution:
I added this class to my project GraphAdapterBuilder, and changed the last line of my controller for:
GsonBuilder gsonBuilder = new GsonBuilder(); new GraphAdapterBuilder().addType(User.class).registerOn(gsonBuilder); Gson gson = gsonBuilder.create(); return gson;
That way I get this Json in response, with all the needed information:
{"draw":"1","recordsFiltered":"3","recordsTotal":"3","data":[{"0x1":{"idUser":3,"username":"grtyg","name":"","lastname":"","totalRecords":3,"rol":{"idRol":2,"rol":"User ad"}}}}]}
I could had simply use the javax @Transient annotation in the Rol entity as below:
@Transient @OneToMany(cascade = CascadeType.ALL, mappedBy = "rol") private Set<User> users;
but later on I would need to use it.