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

Vazamento de Memória ao colocar response.data

Bom dia! Quando coloco apenas response, o código funciona normal conforme o professor mostrou no vídeo, mas ao colocar response.data, não carrega o card do bootstrap, não consigo usar o F12 para ver o erro e logo em seguida a tela fica escura e aparece um erro: Código de erro: Out of Memory. No console só fala sobre a biblioteca jackson-databind-2.11.4.jar:2.11.4 e mais nada, sem erros.

Segue meu código:

<!DOCTYPE html>
<html lang="pt-br">
<head th:replace="~{base :: head('Ofertas | Mudi')}"></head>
<body onload="onLoad()">

    <div th:replace="~{base :: logo}"></div>

    <div class="container" id="ofertas">

        <div
            th:replace="~{base :: titulo('Vamos negociar? Faça sua oferta.')}"></div>

        <div class="card mb-3" v-for="pedido in pedidos">

            <div class="card-header alert-dark">{{pedido.nomeProduto}}</div>

            <div class="card-body">
                <div class="row">
                    <div class="col-12 col-sm-8 mb-3">
                        <div class="row">
                            <div class="col-md-5">
                                Valor: <input />
                            </div>
                            <div class="col-md-7">
                                Data de entrega: <input />
                            </div>
                        </div>
                        <div>Produto</div>
                        <div>
                            <a v-bind:href="pedido.urlProduto">{{pedido.nomeProduto}}</a>
                        </div>
                        <div>Descrição</div>
                        <div>
                            <textarea class="form-control" rows="" cols="">{{pedido.descricao}}</textarea>
                        </div>
                    </div>
                    <div class="col-12 col-sm-4">
                        <div>
                            <img class="img-thumbnail" v-bind:src="pedido.urlImagem" alt=""
                                src="" />
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <script type="text/javascript">
    function onLoad() {
        new Vue({
              el: '#ofertas',
              data () {
                return {
                    pedidos : []
                }
              },
              mounted () {
                axios
                  .get('http://localhost:8080/api/pedidos/ofertas')
                  .then(response => (this.pedidos = response.data))
                  .catch(error => console.log(error))
              }
            });
    }
    </script>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
</body>
</html>
9 respostas

Após mexer muito no código, percebi que o Rest Controller está gerando os objetos em JSON em loop infinito. Ele traz o mesmo objeto diversas vezes até dar o problema de vazamento de memória.

Meu código:

package br.com.alura.mvc.mudi.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.mvc.mudi.model.Pedido;
import br.com.alura.mvc.mudi.model.StatusPedido;
import br.com.alura.mvc.mudi.repository.PedidoRepository;

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

    @Autowired
    private PedidoRepository pedidoRepository;

    @GetMapping("/ofertas")
    public List<Pedido> getPedidosOfertas(){

        Sort sort = Sort.by("id").descending();
        PageRequest paginacao = PageRequest.of(0, 10, sort);

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

    }
}
solução!

Consegui resolver após colocar algumas anotações do JSON nas entidades:

Na classe PEDIDO:

@Entity
@JsonIdentityInfo(
          generator = ObjectIdGenerators.PropertyGenerator.class, 
          property = "id")
public class Pedido { ... }

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

Na classe USER:

@Entity
@Table(name = "users")
@JsonIdentityInfo(
          generator = ObjectIdGenerators.PropertyGenerator.class, 
          property = "id")
public class User { ... }


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

Me livrei do erro, mas usando a sua solução Dyane a querry ta carregando dados que n deveriam, ta muito estranho, ele carrega os 2 pedidos AGUARDANDO, até ai tudo bem, mas ele traz junto todos os pedidos que esse usuário possui e até mesmo os dados desse usuário, como password. Ta muito confuso.

Esse é o resultado no browser:

[
  {
    "id": 3,
    "nomeProduto": "Xiaomi Mi 10T Pro",
    "valorNegociado": 6000.00,
    "dataDaEntrega": "2021-08-18",
    "urlProduto": "https://www.kabum.com.br/produto/131880/smartphone-xiaomi-mi-10t-pro-5g-tela-6-67-8gb-256gb-prata-cx303pra",
    "urlImagem": "https://images0.kabum.com.br/produtos/fotos/131880/smartphone-xiaomi-mi-10t-pro-5g-tela-6-67-8gb-256gb-prata-cx303pra_1605722410_gg.jpg",
    "descricao": "Smartphone Xiaomi Mi 10T Pro, 5G Tela 6,67´ 8GB/256GB, prata - CX303PRA",
    "status": "AGUARDANDO",
    "user": {
      "username": "123",
      "password": "$2a$10$Q.LBQ11A96U.ASNfwxE/rupN/jc23r9pv5qxzYxfy5PoNjttkea3e",
      "enabled": true,
      "pedidos": [
        {
          "id": 1,
          "nomeProduto": "RX 6900 XT",
          "valorNegociado": null,
          "dataDaEntrega": null,
          "urlProduto": "https://www.kabum.com.br/produto/134513/placa-de-v-deo-asus-rog-strix-lc-radeon-rx-6900-xt-16-gbps-16gb-gddr6-rog-strix-lc-rx6900xt-o16g-gaming",
          "urlImagem": "https://images3.kabum.com.br/produtos/fotos/134513/placa-de-video-asus-rog-strix-lc-radeon-rx-6900-xt-16-gbps-16gb-gddr6-rog-strix-lc-rx6900xt-o16g-gaming_1608727276_gg.jpg",
          "descricao": "Placa de Vídeo ASUS ROG Strix LC Radeon RX 6900 XT, 16 Gbps, 16GB, GDDR6 -  ROG-STRIX-LC-RX6900XT-O16G-GAMING",
          "status": "APROVADO",
          "user": "123"
        },
        3
      ]
    }
  },
  {
    "id": 5,
    "nomeProduto": "Monitor Asus LED TUF Gaming 31.5",
    "valorNegociado": null,
    "dataDaEntrega": null,
    "urlProduto": "https://www.kabum.com.br/cgi-local/site/produtos/descricao_ofertas.cgi?codigo=115238",
    "urlImagem": "https://images8.kabum.com.br/produtos/fotos/115238/monitor-gamer-asus-led-tuf-gaming-31-5-wqhd-hdmi-displayport-freesync-165hz-1ms-vg32vq1b_1597350761_gg.jpg",
    "descricao": "Monitor doidera",
    "status": "AGUARDANDO",
    "user": {
      "username": "rod",
      "password": "$2a$10$kKWdGaWW.Us5kpJ6g99BhuJv882QCcZhqxEPN5yVCv20GVHJsWDK6",
      "enabled": true,
      "pedidos": [
        {
          "id": 2,
          "nomeProduto": "teste1",
          "valorNegociado": 300.00,
          "dataDaEntrega": "2021-08-13",
          "urlProduto": "teste",
          "urlImagem": "https://www.animeunited.com.br/oomtumtu/2021/04/EfFUquRXgAEcI15-1024x576.jpg",
          "descricao": "solo leveling é lecal",
          "status": "ENTREGUE",
          "user": "rod"
        },
        5,
        {
          "id": 6,
          "nomeProduto": "Teste Entrega",
          "valorNegociado": 9999.67,
          "dataDaEntrega": "2021-08-31",
          "urlProduto": "https://tenor.com/view/wazatoz-rick-roll-never-gonna-give-you-up-meme-gif-18110697",
          "urlImagem": "https://media.tenor.com/images/323393ed1e06a5850cdc5fd66684f59d/tenor.gif",
          "descricao": "descricao entregada",
          "status": "ENTREGUE",
          "user": "rod"
        }
      ]
    }
  }
]

Como está mapeada as entidades User e Pedido?

Ta assim:

Pedido

@Entity
@JsonIdentityInfo(
        generator = ObjectIdGenerators.PropertyGenerator.class,
        property = "id")
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
    @JsonManagedReference
    private User user;

User

@Entity
@Table(name="users")
@JsonIdentityInfo(
        generator = ObjectIdGenerators.PropertyGenerator.class,
        property = "username")
public class User {
    @Id
    private String username;
    private String password;
    private Boolean enabled;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user", fetch = FetchType.LAZY)
    @JsonManagedReference
    private List<Pedido> pedidos;

Eu troquei property = "id" pra property = "username", pq estava dando erro, imaginei que estaria relacionado a chave primaria, que no meu caso na tabela user a chave primaria é username

Na entidade Pedido muda anotação do atribuído User para:

@ManyToOne(fetch = FetchType.LAZY)

Continuo com o mesmo resultado

Verifica como voce está chamando os pedidos na classe PedidoRest, se não está chamando o usuário junto com os pedidos.

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