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

时间:2015-06-06 16:22:41

标签: java json rest

我正在尝试实施休息服务。我已经创建了我的实体和daos,并且在使用时这个everthyng工作得很好。 但是当我尝试在rest json中公开信息时,会发生无限递归错误。

我已经阅读了很多关于这个错误的话题,但对我来说并不是那么清楚。

我已经尝试了很多替代方案,但每个方案都很难。

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

我尝试过使用Gson并在我的rest方法中返回String,但是发生了stackoverflow错误。

Bellow我发布我的实施(全部),因为我对这个问题一无所知。 我使用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;
    }

}

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

}

我的休息

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

}

0 个答案:

没有答案