Com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError)

I am trying to implement a leisure service. I created my entities and Taoist and using this everthyng works fine. But when I try to expose information in rest json, endless recursion error occurs.

I have read many threads about this error but not so clear to me.

I have tried so many alternatives that it is difficult to talk about each one.

When I debug my code I see the data from the dao is correct, the problem occurs when I use json. I am using jsf page, works great.

I tried to use Gson and return String in my rest method but stackoverflow error occurs.

Bellow I am posting my incarnation (all) because you have no idea about the problem. I am using wildfly server ... Thanks in advance

model

@Entity
@Table(name="usertable")
@NamedQuery(name="UserModel.findAll", query="SELECT u FROM UserModel u")
@XmlRootElement
public class UserModel implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(unique=true, nullable=false)
    private String USId;

    @Temporal(TemporalType.DATE)
    @Column(nullable=false)
    private Date userNascimento;

    @Column(nullable=false, length=45)
    private String USMail;

    @Column(nullable=false, length=150)
    private String USName;

    @Column(nullable=false, length=45)
    private String USNick;

    @Column(nullable=false, length=45)
    private String USPassword;

    //bi-directional many-to-one association to UserAddressModel
    @OneToMany(fetch = FetchType.EAGER, mappedBy="usertable")
    private List<UserAddressModel> listAddressModel;

    //bi-directional many-to-one association to UserFoneModel
    @OneToMany(fetch = FetchType.EAGER, mappedBy="usertable")
    private List<UserFoneModel> listFoneModel;

    public UserModel() {
    }

    public String getUSId() {
        return this.USId;
    }

    public void setUSId(String USId) {
        this.USId = USId;
    }

    public Date getUserNascimento() {
        return this.userNascimento;
    }

    public void setUserNascimento(Date userNascimento) {
        this.userNascimento = userNascimento;
    }

    public String getUSMail() {
        return this.USMail;
    }

    public void setUSMail(String USMail) {
        this.USMail = USMail;
    }

    public String getUSName() {
        return this.USName;
    }

    public void setUSName(String USName) {
        this.USName = USName;
    }

    public String getUSNick() {
        return this.USNick;
    }

    public void setUSNick(String USNick) {
        this.USNick = USNick;
    }

    public String getUSPassword() {
        return this.USPassword;
    }

    public void setUSPassword(String USPassword) {
        this.USPassword = USPassword;
    }

    public List<UserAddressModel> getUseraddresstables() {
        return this.listAddressModel;
    }

    public void setUseraddresstables(List<UserAddressModel> useraddresstables) {
        this.listAddressModel = useraddresstables;
    }

    public UserAddressModel addUseraddresstable(UserAddressModel useraddresstable) {
        getUseraddresstables().add(useraddresstable);
        useraddresstable.setUsertable(this);

        return useraddresstable;
    }

    public UserAddressModel removeUseraddresstable(UserAddressModel useraddresstable) {
        getUseraddresstables().remove(useraddresstable);
        useraddresstable.setUsertable(null);

        return useraddresstable;
    }

    public List<UserFoneModel> getUserfonetables() {
        return this.listFoneModel;
    }

    public void setUserfonetables(List<UserFoneModel> userfonetables) {
        this.listFoneModel = userfonetables;
    }

    public UserFoneModel addUserfonetable(UserFoneModel userfonetable) {
        getUserfonetables().add(userfonetable);
        userfonetable.setUsertable(this);

        return userfonetable;
    }

    public UserFoneModel removeUserfonetable(UserFoneModel userfonetable) {
        getUserfonetables().remove(userfonetable);
        userfonetable.setUsertable(null);

        return userfonetable;
    }

}


@Entity
@Table(name="userfonetable")
@NamedQuery(name="UserFoneModel.findAll", query="SELECT u FROM UserFoneModel u")
public class UserFoneModel implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(unique=true, nullable=false)
    private String UFId;

    @Column(nullable=false)
    private short UFDdd;

    @Column(nullable=false)
    private int UFFone;


    //bi-directional many-to-one association to UserModel
    @ManyToOne
    @JoinColumn(name="UFUserID", nullable=false)
    private UserModel usertable;

    //bi-directional many-to-one association to OperadorasModel
    @ManyToOne
    @JoinColumn(name="UFOperadoraID", nullable=false)
    private OperadorasModel operadorastable;

    //bi-directional many-to-one association to TiposFoneModel
    @ManyToOne
    @JoinColumn(name="UFTipoTelefone", nullable=false)
    private TiposFoneModel tbTipostelefone;

    public UserFoneModel() {
    }

    public String getUFId() {
        return this.UFId;
    }

    public void setUFId(String UFId) {
        this.UFId = UFId;
    }

    public short getUFDdd() {
        return this.UFDdd;
    }

    public void setUFDdd(short UFDdd) {
        this.UFDdd = UFDdd;
    }

    public int getUFFone() {
        return this.UFFone;
    }

    public void setUFFone(int UFFone) {
        this.UFFone = UFFone;
    }


    public UserModel getUsertable() {
        return this.usertable;
    }

    public void setUsertable(UserModel usertable) {
        this.usertable = usertable;
    }

    public OperadorasModel getOperadorastable() {
        return this.operadorastable;
    }

    public void setOperadorastable(OperadorasModel operadorastable) {
        this.operadorastable = operadorastable;
    }

    public TiposFoneModel getTbTipostelefone() {
        return this.tbTipostelefone;
    }

    public void setTbTipostelefone(TiposFoneModel tbTipostelefone) {
        this.tbTipostelefone = tbTipostelefone;
    }

}


@Entity
@Table(name="useraddresstable")
@NamedQuery(name="UserAddressModel.findAll", query="SELECT u FROM UserAddressModel u")
public class UserAddressModel implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(unique=true, nullable=false)
    private String UAId;

    @Column(nullable=false, length=100)
    private String UABairro;

    @Column(nullable=false, length=100)
    private String UACidade;

    @Column(length=45)
    private String UAComplemento;

    @Column(nullable=false, length=2)
    private String UAEstado;

    @Column(nullable=false)
    private int UANumero;

    @Column(length=100)
    private String UARua;

    //bi-directional many-to-one association to UserModel
    @ManyToOne
    @JoinColumn(name="UAUserID", nullable=false)
    private UserModel usertable;

    public UserAddressModel() {
    }

    public String getUAId() {
        return this.UAId;
    }

    public void setUAId(String UAId) {
        this.UAId = UAId;
    }

    public String getUABairro() {
        return this.UABairro;
    }

    public void setUABairro(String UABairro) {
        this.UABairro = UABairro;
    }

    public String getUACidade() {
        return this.UACidade;
    }

    public void setUACidade(String UACidade) {
        this.UACidade = UACidade;
    }

    public String getUAComplemento() {
        return this.UAComplemento;
    }

    public void setUAComplemento(String UAComplemento) {
        this.UAComplemento = UAComplemento;
    }

    public String getUAEstado() {
        return this.UAEstado;
    }

    public void setUAEstado(String UAEstado) {
        this.UAEstado = UAEstado;
    }

    public int getUANumero() {
        return this.UANumero;
    }

    public void setUANumero(int UANumero) {
        this.UANumero = UANumero;
    }

    public String getUARua() {
        return this.UARua;
    }

    public void setUARua(String UARua) {
        this.UARua = UARua;
    }

    public UserModel getUsertable() {
        return this.usertable;
    }

    public void setUsertable(UserModel usertable) {
        this.usertable = usertable;
    }

}


@Entity
@Table(name="tb_tipostelefone")
@NamedQuery(name="TiposFoneModel.findAll", query="SELECT t FROM TiposFoneModel t")
public class TiposFoneModel implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(unique=true, nullable=false)
    private short TFId;

    @Column(nullable=false, length=45)
    private String TFDescricao;

    //bi-directional many-to-one association to UserFoneModel
    @OneToMany(fetch = FetchType.EAGER, mappedBy="tbTipostelefone")
    private List<UserFoneModel> listFoneModel;

    public TiposFoneModel() {
    }

    public short getTFId() {
        return this.TFId;
    }

    public void setTFId(short TFId) {
        this.TFId = TFId;
    }

    public String getTFDescricao() {
        return this.TFDescricao;
    }

    public void setTFDescricao(String TFDescricao) {
        this.TFDescricao = TFDescricao;
    }

    public List<UserFoneModel> getUserfonetables() {
        return this.listFoneModel;
    }

    public void setUserfonetables(List<UserFoneModel> userfonetables) {
        this.listFoneModel = userfonetables;
    }

    public UserFoneModel addUserfonetable(UserFoneModel userfonetable) {
        getUserfonetables().add(userfonetable);
        userfonetable.setTbTipostelefone(this);

        return userfonetable;
    }

    public UserFoneModel removeUserfonetable(UserFoneModel userfonetable) {
        getUserfonetables().remove(userfonetable);
        userfonetable.setTbTipostelefone(null);

        return userfonetable;
    }

}


@Entity
@Table(name="operadorastable")
@NamedQuery(name="OperadorasModel.findAll", query="SELECT o FROM OperadorasModel o")
public class OperadorasModel implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(unique=true, nullable=false)
    private short OPCodigo;

    @Column(nullable=false, length=100)
    private String opNome;

    //bi-directional many-to-one association to UserFoneModel
    @OneToMany(fetch = FetchType.EAGER, mappedBy="operadorastable")
    private List<UserFoneModel> listFoneModel;

    public OperadorasModel() {
    }

    public short getOPCodigo() {
        return this.OPCodigo;
    }

    public void setOPCodigo(short OPCodigo) {
        this.OPCodigo = OPCodigo;
    }

    public String getOpNome() {
        return this.opNome;
    }

    public void setOpNome(String opNome) {
        this.opNome = opNome;
    }

    public List<UserFoneModel> getUserfonetables() {
        return this.listFoneModel;
    }

    public void setUserfonetables(List<UserFoneModel> userfonetables) {
        this.listFoneModel = userfonetables;
    }

    public UserFoneModel addUserfonetable(UserFoneModel userfonetable) {
        getUserfonetables().add(userfonetable);
        userfonetable.setOperadorastable(this);

        return userfonetable;
    }

    public UserFoneModel removeUserfonetable(UserFoneModel userfonetable) {
        getUserfonetables().remove(userfonetable);
        userfonetable.setOperadorastable(null);

        return userfonetable;
    }

}

      

DAO

@Stateless
@LocalBean
public class UserDao {

    /**
     * Default constructor. 
     */

    @PersistenceContext
    EntityManager em;

    public UserDao() {
        // TODO Auto-generated constructor stub
    }


    public List<UserModel> listAll()
    {

         CriteriaBuilder cb = em.getCriteriaBuilder();
         CriteriaQuery<UserModel> cq = cb.createQuery(UserModel.class);
         Root<UserModel> rootEntry = cq.from(UserModel.class);
         CriteriaQuery<UserModel> all = cq.select(rootEntry);
         TypedQuery<UserModel> allQuery = em.createQuery(all);
         List<UserModel> listU = allQuery.getResultList();
         return listU;

        /*
        Query query = em.createQuery("SELECT u FROM UserModel u");
        return query.getResultList();
        */
    }

}

      

My vacation

import java.util.List;

import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import br.com.avera.dao.UserDao;
import br.com.avera.model.UserAddressModel;
import br.com.avera.model.UserFoneModel;
import br.com.avera.model.UserModel;

@Path("/users")
public class UserRest {

    @Inject
    UserDao userDao;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public UserModel getUser()
    {       
        List<UserModel> userModelList = userDao.listAll();
        UserModel userModel = userModelList.get(0);
        List<UserFoneModel> lFone = userModel.getUserfonetables();
        for (UserFoneModel userFoneModel : lFone) {
            System.out.println(userFoneModel.getUFDdd());
            System.out.println(userFoneModel.getUFFone());
        }
        System.out.println("OOOOOO");
        List<UserAddressModel> lAddressModels = userModel.getUseraddresstables();
        for (UserAddressModel userAddressModel : lAddressModels) {
            System.out.println(userAddressModel.getUACidade());
            System.out.println(userAddressModel.getUAEstado());
        }
        return userModel;
    }

}

      

+3


source to share





All Articles