首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gson StackOverflow on JSONWriter

Gson StackOverflow on JSONWriter
EN

Stack Overflow用户
提问于 2015-02-20 13:23:55
回答 1查看 1.4K关注 0票数 0

我创建了一个系统,它允许通过Webservice访问,与他一起我发布了一个维护列表,这个列表是由对象:Cliente, Endereco, Manutencao, StatusManutencao形成的。

我有一个类,它寻求工作台所有的维护,即Class:PesquisaManutencoesWebService,以及接收调用webservice调用SimpleRestService的类。

当我在JSON (return gson.toJson (ws.getJson ());)中转出维护列表时,会生成以下错误:

代码语言:javascript
复制
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。

有谁可以帮我?谢谢。

类客户

代码语言:javascript
复制
@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<>();

Endereco类

代码语言:javascript
复制
@Entity
@Table(name = "endereco")
public class Endereco implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
private Long id;

@NotBlank @Size(max = 150)
@Column(nullable = false, length = 150)
private String logradouro;

@NotBlank @Size(max = 20)
@Column(nullable = false, length = 20)
private String numero;

@Size(max = 100)
@Column(length = 100)
private String complemento;

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

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

@NotBlank @Size(max = 8)
@Column(nullable = false, length = 8)
private String cep;

//@NotBlank
@ManyToOne
@JoinColumn(name = "cliente_id", nullable = false)
private Cliente cliente;

getters and setters ...

Manutencao课

代码语言:javascript
复制
@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 ...

类StatusManutencao

代码语言:javascript
复制
@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 ...

类PesquisaManutencaoWebService

代码语言:javascript
复制
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);
}
}

类SimpleRestService

代码语言:javascript
复制
@Path("service")
public class SimpleRestService {

private PesquisaManutencoesWebService ws;

@GET
@Produces("application/json")
@Path("/{codigoAcesso}/")
public String getManutencoes(@PathParam("codigoAcesso") String codigoAcesso) throws IOException, SQLException, ClassNotFoundException{
    ws = new PesquisaManutencoesWebService();
    Gson gson = new GsonBuilder().serializeSpecialFloatingPointValues().setPrettyPrinting().create();
    return gson.toJson(ws.getJson());
}
}
EN

回答 1

Stack Overflow用户

发布于 2018-02-01 10:23:52

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

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

代码语言:javascript
复制
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "cliente_id")
private Cliente cliente;

当您将FetchType设置为Lazy时,基本上是说该实体不应该嵌套到父实体。

然后尝试手动获取客户端列表..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28630031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档