Java com.fasterxml.jackson.databind.JsonMappingException:无限递归(StackOverflowerr)

Java com.fasterxml.jackson.databind.JsonMappingException:无限递归(StackOverflowerr),java,json,rest,Java,Json,Rest,我正在尝试实现rest服务。我已经创建了我的实体和DAO,当使用这个everthyng时效果很好。 但是当我尝试在RESTJSON中公开信息时,就会出现无限递归错误 我读过很多关于这个错误的话题,但对我来说不是很清楚 我很抱歉,我已经尝试了太多的选择,每一个都很难谈论 当我调试代码时,我看到来自dao的数据是正确的,当我尝试使用json时,问题就出现了。当我使用jsf时,页面工作正常 我已尝试在rest方法中使用Gson和返回字符串,但发生stackoverflow错误 下面我发布了我的请求(全

我正在尝试实现rest服务。我已经创建了我的实体和DAO,当使用这个everthyng时效果很好。 但是当我尝试在RESTJSON中公开信息时,就会出现无限递归错误

我读过很多关于这个错误的话题,但对我来说不是很清楚

我很抱歉,我已经尝试了太多的选择,每一个都很难谈论

当我调试代码时,我看到来自dao的数据是正确的,当我尝试使用json时,问题就出现了。当我使用jsf时,页面工作正常

我已尝试在rest方法中使用Gson和返回字符串,但发生stackoverflow错误

下面我发布了我的请求(全部),因为我不知道这个问题。 我正在使用wildfly服务器。。。 提前谢谢

型号的

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

}
@实体
@表(name=“usertable”)
@NamedQuery(name=“UserModel.findAll”,query=“从UserModel u中选择u”)
@XmlRootElement
公共类UserModel实现了可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(unique=true,nullable=false)
私人字符串USId;
@时态(TemporalType.DATE)
@列(nullable=false)
私人约会用户Nascimento;
@列(nullable=false,长度=45)
专用字符串USMail;
@列(nullable=false,长度=150)
私有字符串USName;
@列(nullable=false,长度=45)
私有字符串USNick;
@列(nullable=false,长度=45)
私有字符串USPassword;
//与UserAddressModel的双向多对一关联
@OneToMany(fetch=FetchType.EAGER,mappedBy=“usertable”)
私有列表模型;
//与UserFoneModel的双向多对一关联
@OneToMany(fetch=FetchType.EAGER,mappedBy=“usertable”)
私有列表listFoneModel;
公共用户模型(){
}
公共字符串getUSId(){
返回此.USId;
}
公共void setUSId(字符串USId){
this.USId=USId;
}
公共日期getUserNascimento(){
返回this.userNascimento;
}
公共无效setUserNascimento(日期userNascimento){
this.userNascimento=userNascimento;
}
公共字符串getUSMail(){
返回此.USMail;
}
public void setUSMail(字符串USMail){
this.USMail=USMail;
}
公共字符串getUSName(){
返回此.USName;
}
公共void setUSName(字符串USName){
this.USName=USName;
}
公共字符串getUSNick(){
返回此.USNick;
}
公共void setUSNick(字符串USNick){
this.USNick=USNick;
}
公共字符串getUSPassword(){
返回此.USPassword;
}
public void setUSPassword(字符串USPassword){
this.USPassword=USPassword;
}
公共列表getUseraddresstables(){
返回此.listAddressModel;
}
public void setUseraddresstables(列出useraddresstables){
this.listAddressModel=useraddresstables;
}
公共UserAddressModel addUseraddresstable(UserAddressModel useraddresstable){
getUseraddresstables().add(useraddresstable);
useraddresstable.setUsertable(此);
返回useraddresstable;
}
公共UserAddressModel removeUseraddresstable(UserAddressModel useraddresstable){
getUseraddresstables().remove(useraddresstable);
useraddresstable.setUsertable(空);
返回useraddresstable;
}
公共列表getUserfonetables(){
返回此.listFoneModel;
}
公共void setUserfonetables(列出userfonetables){
this.listFoneModel=userfonetables;
}
公共UserFoneModel addUserfonetable(UserFoneModel userfonetable){
getUserFonetTables().add(userFonetTable);
setUsertable(这个);
返回userfonetable;
}
public UserFoneModel removeUserfonetable(UserFoneModel userfonetable){
getUserFonetTables().remove(userFonetTable);
setUsertable(空);
返回userfonetable;
}
}
@实体
@表(name=“userfonetable”)
@NamedQuery(name=“UserFoneModel.findAll”,query=“从UserFoneModel u中选择u”)
公共类UserFoneModel实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(unique=true,nullable=false)
私有字符串UFId;
@列(nullable=false)
私人短UFDdd;
@列(nullable=false)
乌夫丰私人酒店;
//与UserModel的双向多对一关联
@许多酮
@JoinColumn(name=“UFUserID”,nullable=false)
私有用户模型用户表;
//OperadorasModel的双向多对一关联
@许多酮
@JoinColumn(name=“UFOperadoraID”,null=false)
私人歌剧院模型歌剧院;
//TiposFoneModel的双向多对一关联
@许多酮
@JoinColumn(name=“UFTipoTelefone”,nullable=false)
私人TiposFoneModel tbTipostelefone;
public UserFoneModel(){
}
公共字符串getUFId(){
返回此.UFId;
}
公共void setUFId(字符串UFId){
this.UFId=UFId;
}
公共短消息getUFDdd(){
返回此.UFDdd;
}
公共无效设置UFDdd(简称UFDdd){
this.UFDdd=UFDdd;
}
public int getUFFone(){
退回这个.UFFone;
}
公共空间设置为空(内部为空){
this.UFFone=UFFone;
}
公共用户模型getUsertable(){
返回this.usertable;
}
公共void setUsertable(UserModel usertable){
this.usertable=usertable;
}
公共OperadorModel getOperadorastable(){
返回此文件。可操作性;
}
公共无效设置operadorastable(OperadorasModel operadorastable){
this.operadorastable=operadorastable;
}
公共TiposFoneModel gettbtipstelefone(){
返回此.tbTipostelefone;
}
公共v
@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();
        */
    }

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

}