Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Erro ao chamar a api rest

Ao invocar a API é lançado o erro abaixo, o json não é montato corretamente.

2021-05-07 22:39:47.695 ERROR 30321 --- [nio-8085-exec-1] s.e.ErrorMvcAutoConfiguration$StaticView : Cannot render error page for request [/api/pedidos/aguardando] and exception [Could not write JSON: Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: br.com.alura.springmvc.model.Pedido["user"]->br.com.alura.springmvc.model.User$HibernateProxy$nH21A4iY["pedidos"]->org.hibernate.collection.internal.PersistentBag[0]->br.com.alura.springmvc.model.Pedido["user"]-
.....
>br.com.alura.springmvc.model.Pedido["user"]->br.com.alura.springmvc.model.User$HibernateProxy$nH21A4iY["pedidos"]->org.hibernate.collection.internal.PersistentBag[0]->br.com.alura.springmvc.model.Pedido["user"]->br.com.alura.springmvc.model.User$HibernateProxy$nH21A4iY["pedidos"]->org.hibernate.collection.internal.PersistentBag[0]->br.com.alura.springmvc.model.Pedido["user"]->br.com.alura.springmvc.model.User$HibernateProxy$nH21A4iY["pedidos"]->org.hibernate.collection.internal.PersistentBag[0]->br.com.alura.springmvc.model.Pedido["user"]->br.com.alura.springmvc.model.User$HibernateProxy$nH21A4iY["pedidos"]->org.hibernate.collection.internal.PersistentBag[0]->br.com.alura.springmvc.model.Pedido["user"]->br.com.alura.springmvc.model.User$HibernateProxy$nH21A4iY["pedidos"]->org.hibernate.collection.internal.PersistentBag[0]->br.com.alura.springmvc.model.Pedido["user"]->br.com.alura.springmvc.model.User$HibernateProxy$nH21A4iY["pedidos"]->org.hibernate.collection.internal.PersistentBag[0]->br.com.alura.springmvc.model.Pedido["dataDaEntrega"])] as the response has already been committed. As a result, the response may have the wrong status code
4 respostas

coloquei esta anotação @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"} nas classes de entidades e o json foi gerado, porém ele mostra informações usuários, como fazer para ele não listar.

Porque foi necessário utilizar esta anotação @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"} e no exemplo não foi usada?

abaixo as classes

Classe Pedido

package br.com.alura.springmvc.model;

import java.math.BigDecimal;
import java.time.LocalDate;

import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Entity
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Pedido {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nomeProduto;
    private BigDecimal valorNegociado;
    private LocalDate dataDaEntrega;
    private String urlProduto;
    private String urlImagem;
    private String descricao;

    @Enumerated(EnumType.STRING)
    private StatusPedido status;

    @ManyToOne(fetch = FetchType.LAZY)
    private User user;

    public String getNomeProduto() {
        return nomeProduto;
    }
    public void setNomeProduto(String nomeProduto) {
        this.nomeProduto = nomeProduto;
    }
    public BigDecimal getValorNegociado() {
        return valorNegociado;
    }
    public void setValorNegociado(BigDecimal valorNegociado) {
        this.valorNegociado = valorNegociado;
    }
    public LocalDate getDataDaEntrega() {
        return dataDaEntrega;
    }
    public void setDataDaEntrega(LocalDate dataDaEntrega) {
        this.dataDaEntrega = dataDaEntrega;
    }
    public String getUrlProduto() {
        return urlProduto;
    }
    public void setUrlProduto(String urlProduto) {
        this.urlProduto = urlProduto;
    }
    public String getUrlImagem() {
        return urlImagem;
    }
    public void setUrlImagem(String urlImagem) {
        this.urlImagem = urlImagem;
    }
    public String getDescricao() {
        return descricao;
    }
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
    public StatusPedido getStatus() {
        return status;
    }
    public void setStatus(StatusPedido status) {
        this.status = status;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }





}

Classe User

package br.com.alura.springmvc.model;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@Entity
@Table(name="users")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class User {
    @Id
    private String username;
    private String password;
    private Boolean enabled;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user", fetch = FetchType.LAZY)
    private List<Pedido> pedidos;


    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Boolean getEnabled() {
        return enabled;
    }
    public void setEnabled(Boolean enabled) {
        this.enabled = enabled;
    }




}

Classe PedidosRest

package br.com.alura.springmvc.api;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import br.com.alura.springmvc.model.Pedido;
import br.com.alura.springmvc.model.StatusPedido;
import br.com.alura.springmvc.repository.PedidoRepository;

@RestController
@RequestMapping("/api/pedidos")
public class PedidosRest {

    @Autowired
    private PedidoRepository pedidoRepository;

    @GetMapping("aguardando")
    public List<Pedido> getPedidosAguardandoOfertas() {
        // ordenando por ordem descentede Spring Data JPA
        Sort sort = Sort.by("id").descending();
        PageRequest paginacao = PageRequest.of(0, 10, sort); // mostra desde a primeira pagina com 1 item por pagina
                                                                // (este item por pagina pode ser customizado de acordo
                                                                // com a necessidade)

        return pedidoRepository.findByStatus(StatusPedido.AGUARDANDO, paginacao);
    }

}

Json de saida

0    
nomeProduto    "kit ferramentas sparta"
valorNegociado    null
dataDaEntrega    null
urlProduto    "https://www.magazineluiza.com.br/kit-ferramentas-sparta-129-pecas-13564-com-maleta/p/220907400/fs/fjgf/"
urlImagem    "https://a-static.mlcdn.com.br/618x463/kit-ferramentas-sparta-129-pecas-13564-com-maleta/magazineluiza/220907400/36338f97fa3799f3dcfa7d138f756925.jpg"
descricao    "kit ferramentas"
status    "AGUARDANDO"
user    
username    "marcos"
password    "$2a$10$GxQGbhcc7LtGA2D5zh02Uehxd.rhc2CZebBUqF.3RbL2czuFfPUJW"
enabled    true
1    
nomeProduto    "livro harry"
valorNegociado    null
dataDaEntrega    null
urlProduto    "https://www.magazineluiza.com.br/livro-box-harry-potter-edicao-comemorativa-20-anos-capa-dura/p/225550700/li/lljl/"
urlImagem    "https://a-static.mlcdn.com.br/618x463/livro-box-harry-potter-edicao-comemorativa-20-anos-capa-dura/magazineluiza/225550700/a94e0cd6b2c17b2d92d1ed6b0d717530.jpg"
descricao    "livro"
status    "AGUARDANDO"
user    
username    "marcos"
password    "$2a$10$GxQGbhcc7LtGA2D5zh02Uehxd.rhc2CZebBUqF.3RbL2czuFfPUJW"
enabled    true
solução!

Resolvi o problema, não havia colocado a anotação @JsonIgnore na classe pedido no atributo user, após fazer isso não foi necessário utilizar a anotação @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) e o sistema rodou.

    @ManyToOne(fetch = FetchType.LAZY)
    @JsonIgnore
    private User user;