JSONWriter上的Gson堆栈溢出

JSONWriter上的Gson堆栈溢出,json,hibernate,jersey,gson,Json,Hibernate,Jersey,Gson,我通过Webservice Restful创建了一个系统和it自由访问,我和他一起发布了一个维护列表,该列表由以下对象组成:Cliente、Endereco、Manutencao、StatusManutencao 我有一个类,它寻找所有维护类:pesquisamanutescoewbservice,接收调用webservice的类调用SimpleRestService 当我在JSON中打开维护列表时,返回gson.toJson ws.getJson;,由以下错误生成: java.lang.Sta

我通过Webservice Restful创建了一个系统和it自由访问,我和他一起发布了一个维护列表,该列表由以下对象组成:Cliente、Endereco、Manutencao、StatusManutencao

我有一个类,它寻找所有维护类:pesquisamanutescoewbservice,接收调用webservice的类调用SimpleRestService

当我在JSON中打开维护列表时,返回gson.toJson ws.getJson;,由以下错误生成:

java.lang.StackOverflowError
java.io.StringWriter.write (StringWriter.java:112)
com.google.gson.stream.JsonWriter.string (JsonWriter.java:559)
com.google.gson.stream.JsonWriter.writeDeferredName (JsonWriter.java:402)
com.google.gson.stream.JsonWriter.value (JsonWriter.java:495)
com.google.gson.internal.bind.TypeAdapters $ 8.write (TypeAdapters.java:268)
已经测试过列表是否有效,并且确实有效,我可以获得我想要的所有数据,但我无法将其转换为JSON

有人能帮我吗?谢谢

阶级客户

@Entity
@Table(name = "cliente")
public class Cliente implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
private Long id;

@NotBlank @Size(max = 6)
@Column(nullable = false, length = 6)
private String codigoAcesso;

@NotBlank @Size(max = 100)
@Column(nullable = false, length = 100)
private String nome;

@Size(max = 150)
@Column(nullable = true, length = 150)
private String email;

@NotBlank @Size(max = 14)
@Column(name = "doc_receita_federal", nullable = false, length = 14)
private String documentoReceitaFederal;

@Enumerated(EnumType.STRING)
@Column(nullable = false, length = 15)
private TipoPessoa tipo;

@OneToMany(mappedBy = "cliente", cascade = CascadeType.ALL)
private List<Endereco> enderecos = new ArrayList<>();
Manutencao类

@Entity
@Table(name = "manutencao")
public class Manutencao implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
private Long id;

@ManyToOne
@JoinColumn(name = "cliente_id")
private Cliente cliente;

@Embedded
private StatusManutencao status;

@NotBlank 
@Column(nullable = false, length = 255, name="descricao_manutencao")
private String descricaoManutencao;

@Column(name = "valor", precision = 10, scale = 2)
private BigDecimal valor;

getters and setters ...
@Embeddable
public class StatusManutencao implements Serializable {

private static final long serialVersionUID = 1L;

@Column(name="recebido")
@Type(type="true_false")
private boolean recebido;

@Temporal(TemporalType.DATE)
@Column(name="data_recebimento")
private Date dataRecebimento;

@Column(name="em_manutencao")
@Type(type="true_false")
private boolean emManutencao;

@Temporal(TemporalType.DATE)
@Column(name="data_manutencao")
private Date dataManutencao;

@Column(name="manutencao_finalizada")
@Type(type="true_false")
private boolean manutencaoFinalizada;

@Temporal(TemporalType.DATE)
@Column(name="data_finalizacao")
private Date dataFinalizacao;

@Column(name="entregue")
@Type(type="true_false")
private boolean entregue;

@Temporal(TemporalType.DATE)
@Column(name="data_entrega")
private Date dataEntrega;

@Column(name="pago")
@Type(type="true_false")
private boolean pago;

@Temporal(TemporalType.DATE)
@Column(name="data_pagamento")
private Date dataPagamento;

getters and setters ...
类状态Manutencao

@Entity
@Table(name = "manutencao")
public class Manutencao implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
private Long id;

@ManyToOne
@JoinColumn(name = "cliente_id")
private Cliente cliente;

@Embedded
private StatusManutencao status;

@NotBlank 
@Column(nullable = false, length = 255, name="descricao_manutencao")
private String descricaoManutencao;

@Column(name = "valor", precision = 10, scale = 2)
private BigDecimal valor;

getters and setters ...
@Embeddable
public class StatusManutencao implements Serializable {

private static final long serialVersionUID = 1L;

@Column(name="recebido")
@Type(type="true_false")
private boolean recebido;

@Temporal(TemporalType.DATE)
@Column(name="data_recebimento")
private Date dataRecebimento;

@Column(name="em_manutencao")
@Type(type="true_false")
private boolean emManutencao;

@Temporal(TemporalType.DATE)
@Column(name="data_manutencao")
private Date dataManutencao;

@Column(name="manutencao_finalizada")
@Type(type="true_false")
private boolean manutencaoFinalizada;

@Temporal(TemporalType.DATE)
@Column(name="data_finalizacao")
private Date dataFinalizacao;

@Column(name="entregue")
@Type(type="true_false")
private boolean entregue;

@Temporal(TemporalType.DATE)
@Column(name="data_entrega")
private Date dataEntrega;

@Column(name="pago")
@Type(type="true_false")
private boolean pago;

@Temporal(TemporalType.DATE)
@Column(name="data_pagamento")
private Date dataPagamento;

getters and setters ...
类PesquisManutenCoWebService

public class PesquisaManutencoesWebService implements Serializable {

private static final long serialVersionUID = 1L;

private EntityManager manager;
private EntityManagerFactory factory;
private EntityTransaction trx;


public PesquisaManutencoesWebService(){
    this.factory = Persistence.createEntityManagerFactory("ManutencaoPU");
    this.manager = factory.createEntityManager();
    this.trx = manager.getTransaction();
    this.trx.begin();
}

@SuppressWarnings("unchecked")
public JsonModel getJson(){
    List<Manutencao> manutencoes = manager.createQuery("SELECT m FROM Manutencao m").getResultList();
    return new JsonModel(manutencoes);
}
}

在大多数情况下,当调用堆栈由于过深或无限递归而超过时,会抛出StackOverError。当在方法中存储局部变量的需要超过分配的堆栈大小时,也会抛出该函数

在您的Endereco类中,将Fetch Type添加到Cliente属性中的@ManyToOne anotation,那么您的代码应该如下所示:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "cliente_id")
private Cliente cliente;
当您将FetchType设置为Lazy时,基本上是说实体不应该嵌套到父实体


然后尝试手动获取客户列表…

您需要对这些双向关系采取一些措施。也许是时候做一个DTO或者一些类似于Jackson的@JsonIgnoreThanks来回答这个问题了你有什么例子可以说明如何做到这一点吗?谢谢。我不用GSON,但看起来很有希望。也许您可以使用@Expose来不尝试并序列化客户端,这是一个问题,因为它引用了Endirico列表,它引用了一个客户端,它引用了Endirico列表。。你明白了。如果客户不需要了解客户,您可以将其排除在Manutencao的代表范围之外。尝试使用该注释。如果客户机确实需要知道客户机的某些属性,那么您可以创建一个只保存您想要的内容的传输对象exposedIt可能看起来是多余的,但这是一种常见的模式,不公开实体层,以及itI尝试编写@expose所带来的其他好处,但现在结果只是一个{}。我做错了什么?我只测试了希望出现在JSON结果中的字段。谢谢