5
respostas

GET http://localhost:8080/pedidos não retorna itens do pedido

Cadastrei todas as classes no projeto conforme a aula 1. Ao testar a aplicação conforme o exemplo dado: POST http://localhost:8080/pedidos o retorno é como esperado, listando os dois itens do pedido:

{
    "id": "3c8c018b-7314-423c-afed-6daf54853793",
    "status": "AGUARDANDO_PAGAMENTO",
    "cpf": "123.456.789-10",
    "itens": [
        {
            "id": 5,
            "descricao": "coca-cola",
            "valorUnitario": 8.99,
            "quantidade": 4
        },
        {
            "id": 6,
            "descricao": "combo sushi",
            "valorUnitario": 65,
            "quantidade": 1
        }
    ],
    "valorTotal": null,
    "data": "2025-03-30"
}

Mas ao tentar recuperar o pedido com GET http://localhost:8080/pedidos a lista de itens vem em branco:

[
    {
        "id": "3c8c018b-7314-423c-afed-6daf54853793",
        "status": "AGUARDANDO_PAGAMENTO",
        "cpf": "123.456.789-10",
        "itens": [],
        "valorTotal": null,
        "data": "2025-03-30"
    }
]

ao fazer SELECT * FROM itens retorna os itens.

Na minha classe Pedido tenho o método:

    public List<ItemPedido> getItens() { 
        return itens; 
    } 
5 respostas

Adicionei @Transactional ao método @PostMapping no controller e o problema dos itens resolveu, mas ao fazer o GET all, o valor total do pedido continua null.

 @PostMapping
    @Transactional
    public ResponseEntity<PedidoResponseDto> cadastrarPedido(@RequestBody PedidoRequestDto pedidoDto) {
        return ResponseEntity.status(HttpStatus.CREATED).body(service.cadastrarPedido(pedidoDto));
    }
{
        "id": "e187e44d-a65c-4c44-9fc0-391bdc9daf86",
        "status": "AGUARDANDO_PAGAMENTO",
        "cpf": "123.456.789-10",
        "itens": [
            {
                "id": 7,
                "descricao": "coca-cola",
                "valorUnitario": 8.99,
                "quantidade": 4
            },
            {
                "id": 8,
                "descricao": "combo sushi",
                "valorUnitario": 65,
                "quantidade": 1
            }
        ],
        "valorTotal": null,
        "data": "2025-03-30"
    }
]

Na classe PedidoService eu calculo o valor do pedido antes de gravar (com @Transactional no controller):

public PedidoResponseDto cadastrarPedido(PedidoRequestDto pedidoDto, boolean erro) {
        Pedido pedido = new Pedido();
        BeanUtils.copyProperties(pedidoDto, pedido);
        Status status = Status.AGUARDANDO_PAGAMENTO;
        pedido.setStatus(status);
        pedido.setData(LocalDate.now());
        pedido.calcularTotal();
        repository.save(pedido);
        return new PedidoResponseDto(pedido.getId(), pedido.getStatus(),
                pedido.getCpf(), pedido.getItens(), pedido.getValorTotal(),
                pedido.getData());
    }

Tive o mesmo problema, para solucionar fiz a persistencia do proprio objeto no meu pedido

    public PedidoResponseDto cadastrandoPedido(PedidoRequestDto pedidoRequestDto) {

        Pedido pedido = new Pedido();
        BeanUtils.copyProperties(pedidoRequestDto, pedido);
        Status status = Status.AGUARDANDO_PAGAMENTO;
        pedido.setStatus(status);
        // Associando os itens ao pedido
        List<ItemPedido> itens = pedidoRequestDto.itens().stream().map(itemDto -> {
            ItemPedido item = new ItemPedido();
            BeanUtils.copyProperties(itemDto, item);
            item.setPedido(pedido);
            return item;
        }).collect(Collectors.toList());

        pedido.setItens(itens); // Adicionando os itens ao pedido
        pedido.setData(LocalDate.now());
        pedido.calcularTotal();

        pedidoRepository.save(pedido);



        status = obterStatusPagamento(pedido.getId().toString());
        pedido.setStatus(status);
        pedidoRepository.save(pedido);

        return new PedidoResponseDto(pedido);

    }

Olá!

ao fazer o select na tabela de itens, a associação com o pedido ocorre corretamente? o pedido_id está preenchido? Para que seja gravado e recuperado corretamente, é necessário fazer a associação na classe Pedido, conforme abaixo:

public void setItens(List<ItemPedido> itens) {
        itens.forEach(i -> i.setPedido(this));
        this.itens = itens;
    }

Se a dúvida persistir, não deixe de nos informar por aqui.

Bons estudos! 😄

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!

Olá, Jaqueline, não estava gravando o pedido_id, passou a gravar só depois que eu adicionei o @Transactional. Ainda não está gravando o valor total do pedido

Olá Clayton,

o cálculo do valor total se dá através da somatório dos itens, que precisam estar associados corretamente através do método que te passei acima. Aquele método, em conjunto com o calcularTotal fazem com que os valores sejam armazenados corretamente. O seu método calcularTotal está como abaixo?

 public void calcularTotal() {
        this.valorTotal = this.itens.stream()
                .map(i -> i.getValorUnitario().multiply(BigDecimal.valueOf(i.getQuantidade())))
                .reduce(BigDecimal.ZERO, BigDecimal::add);
    }

Se a dúvida permanecer, me passa o link do seu projeto no GitHub que consigo verificar melhor :-)