我创建了一个系统,它允许通过Webservice访问,与他一起我发布了一个维护列表,这个列表是由对象:Cliente, Endereco, Manutencao, StatusManutencao形成的。
我有一个类,它寻求工作台所有的维护,即Class:PesquisaManutencoesWebService,以及接收调用webservice调用SimpleRestService的类。
当我在JSON (return 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<>();Endereco类
@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课
@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
@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
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
@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());
}
}发布于 2018-02-01 10:23:52
在大多数情况下,由于过多的深度或无限递归,当调用堆栈超过时会抛出StackOverError。当需要在方法中存储局部变量超过分配的堆栈大小时,也会引发。
在您的Endereco类中,将Fetch类型添加到Cliente属性中的@ManyToOne中,那么您的代码应该如下所示:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "cliente_id")
private Cliente cliente;当您将FetchType设置为Lazy时,基本上是说该实体不应该嵌套到父实体。
然后尝试手动获取客户端列表..。
https://stackoverflow.com/questions/28630031
复制相似问题