I'm working with Spring Boot, AJAX and jQuery. When I make a request and, in the controller, I return entities without relationships, it brings me the data correctly, but when I create binary relations or n-arias errors occur.
In the browser
In java
2017-09-30 17:25:58.007 ERROR 32352 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost] : Exception Processing ErrorPage[errorCode=0, location=/error]
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982) ~[spring-webmvc-4.3.11.RELEASE.jar:4.3.11.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) ~[spring-webmvc-4.3.11.RELEASE.jar:4.3.11.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) ~[tomcat-embed-core-8.5.20.jar:8.5.20]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) ~[spring-webmvc-4.3.11.RELEASE.jar:4.3.11.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) ~[tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.20.jar:8.5.20]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-4.3.11.RELEASE.jar:4.3.11.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.11.RELEASE.jar:4.3.11.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.20.jar:8.5.20]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) ~[spring-web-4.3.11.RELEASE.jar:4.3.11.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.20.jar:8.5.20]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) ~[spring-web-4.3.11.RELEASE.jar:4.3.11.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.20.jar:8.5.20]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) ~[spring-web-4.3.11.RELEASE.jar:4.3.11.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:728) ~[tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:590) ~[tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:524) ~[tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:389) [tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:254) [tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:349) [tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:175) [tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80) [tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799) [tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1457) [tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.20.jar:8.5.20]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_144]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_144]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.20.jar:8.5.20]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_144]
Caused by: java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:624) ~[tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:211) ~[tomcat-embed-core-8.5.20.jar:8.5.20]
at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:109) ~[tomcat-embed-core-8.5.20.jar:8.5.20]
at org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$SpelView.render(ErrorMvcAutoConfiguration.java:227) ~[spring-boot-autoconfigure-1.5.7.RELEASE.jar:1.5.7.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1286) ~[spring-webmvc-4.3.11.RELEASE.jar:4.3.11.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1041) ~[spring-webmvc-4.3.11.RELEASE.jar:4.3.11.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:984) ~[spring-webmvc-4.3.11.RELEASE.jar:4.3.11.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) ~[spring-webmvc-4.3.11.RELEASE.jar:4.3.11.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.11.RELEASE.jar:4.3.11.RELEASE]
... 38 common frames omitted
These are the classes I use:
User
package com.datasig.ventas.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@Entity
@Table(name = "admin_usuarios")
public class Usuario {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "auto_gen")
@SequenceGenerator(name = "auto_gen", sequenceName = "admin_usuarios_id_usuario_seq")
@Column(name = "id_usuario")
private long idUsuario;
@Column(name = "usuario")
private String usuario;
@Column(name = "clave")
private String clave;
@Column(name = "nombre_apellido")
private String nombreApellido;
@Column(name = "telefono")
private String telefono;
@Column(name = "email")
private String email;
@Column(name = "estado")
private String estado;
@ManyToOne
@JoinColumn(name = "rol")
private Rol rol;
public Usuario() {
}
public long getIdUsuario() {
return idUsuario;
}
public void setIdUsuario(long idUsuario) {
this.idUsuario = idUsuario;
}
public String getUsuario() {
return usuario;
}
public void setUsuario(String usuario) {
this.usuario = usuario;
}
public String getClave() {
return clave;
}
public void setClave(String clave) {
this.clave = clave;
}
public String getNombreApellido() {
return nombreApellido;
}
public void setNombreApellido(String nombreApellido) {
this.nombreApellido = nombreApellido;
}
public Rol getRol() {
return rol;
}
public void setRol(Rol Rol) {
this.rol = Rol;
}
@Override
public String toString() {
return usuario;
}
}
Role
package com.datasig.ventas.model;
import java.util.*;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name = "admin_roles")
public class Rol {
@Id
@Column(name = "rol")
private String rol;
@Column(name = "denominacion")
private String denominacion;
@OneToMany(mappedBy = "rol")
public Set<Usuario> usuario;
public Rol() {
}
public Rol(String rol) {
this.rol = rol;
}
public String getRol() {
return rol;
}
public void setRol(String rol) {
this.rol = rol;
}
public String getDenominacion() {
return denominacion;
}
public void setDenominacion(String denominacion) {
this.denominacion = denominacion;
}
public Set<Usuario> getUsuario() {
return usuario;
}
public void setUsuario(Set<Usuario> usuario) {
this.usuario = usuario;
}
}
UserServiceImplement
package com.datasig.ventasweb.serviceImplement;
import com.datasig.ventas.model.Usuario;
import com.datasig.ventasweb.repository.UsuarioRepository;
import com.datasig.ventasweb.service.UsuarioService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UsuarioServiceImplement implements UsuarioService {
private UsuarioRepository UsuarioRepository;
@Autowired
public void setUsuarioRepository(UsuarioRepository artRepository) {
this.UsuarioRepository = artRepository;
}
@Override
public Iterable<Usuario> listAllUsuario() {
return UsuarioRepository.findAll();
}
@Override
public Usuario getUsuarioById(Long id) {
return UsuarioRepository.findOne(id);
}
@Override
public Usuario saveUsuario(Usuario item) {
return UsuarioRepository.save(item);
}
@Override
public void deleteUsuario(Long id) {
UsuarioRepository.delete(id);
}
}
RolServiceImplement
package com.datasig.ventasweb.serviceImplement;
import com.datasig.ventas.model.Rol;
import com.datasig.ventasweb.repository.RolRepository;
import com.datasig.ventasweb.service.RolService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class RolServiceImplement implements RolService {
private RolRepository RolRepository;
@Autowired
public void setRolRepository(RolRepository artRepository) {
this.RolRepository = artRepository;
}
@Override
public Iterable<Rol> listAllRol() {
return RolRepository.findAll();
}
@Override
public Rol getRolById(Long id) {
return RolRepository.findOne(id);
}
@Override
public Rol saveRol(Rol item) {
return RolRepository.save(item);
}
@Override
public void deleteRol(Long id) {
RolRepository.delete(id);
}
}
RestController
package com.datasig.ventas.restController;
import com.datasig.ventas.model.Rol;
import com.datasig.ventas.model.Usuario;
import com.datasig.ventasweb.serviceImplement.RolServiceImplement;
import com.datasig.ventasweb.serviceImplement.UsuarioServiceImplement;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class VentaRestController {
@Autowired
private UsuarioServiceImplement usuarioService;
@RequestMapping(value = "/usuarios", method = RequestMethod.GET)
public Response findAllUsuarios() {
List<Usuario> usuario = (List<Usuario>) usuarioService.listAllUsuario();
Response response = new Response("Done", usuario);
return response;
}
}
jQuery
$( document ).ready(function() {
var url = window.location;
$("#usuarioItem").click(function(event){
event.preventDefault();
ajaxGet();
});
function ajaxGet(){
$.ajax({
type : "GET",
url : url+"/usuarios",
success: function(result){
if(result.status == "Done"){
$('#getResultDiv .list-group li').remove();
var custList = "";
$.each(result.data, function(i, customer){
var customer = "Usuarios " + i + ": usuario=" + customer.usuario + "<br />";
$('#getResultDiv .list-group').append('<li><h4 class="list-group-item">'+customer+'</h4></li>')
});
console.log("Success: ", result);
}else{
$("#getResultDiv").html("<strong>Error</strong>");
console.log("Fail: ", result);
}
},
error : function(e) {
$("#getResultDiv").html("<strong>Error</strong>");
console.log("ERROR: ", e);
}
});
}
})