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

[Bug] Erro ao retornar a chamada POST

Ao fazer a chamada do método POST no Insomnia, percebi que o retorno está montando uma recursão tipo infinita, porque estou fazendo a relação entre duas tabelas e não tinha percebido antes quando eu criei antes de eu mudar para o ResponseEntity. Fiz os ajustes igual ao que sugeriu no curso, incluindo o retorno, que notei que só retorna o primeiro da lista. Como que eu faço para alinhar esse tipo de recursão, por favor? Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidade

    @PostMapping
    @Transactional
    public ResponseEntity createBeneficiary(@RequestBody @Valid DadosCadastroBeneficiario dados, UriComponentsBuilder uriBuilder){
        var beneficiario = new Beneficiario(dados);
        beneficiarioRepository.save(beneficiario);
        var uri = uriBuilder.path("/beneficiaries/{id}").buildAndExpand(beneficiario.getId()).toUri();

        return ResponseEntity.created(uri).body(new DadosDetalhamentoBeneficiario(beneficiario));
    }
6 respostas

Oi!

No seu controller o objeto sendo devolvido é do tipo DadosDetalhamentoBeneficiario. Manda aqui essa classe.

Classe DadosDetalhamentoBeneficiario:

package com.plano.saude.cadastro.domain.beneficiario;

import com.plano.saude.cadastro.domain.documento.Documento;
import com.plano.saude.cadastro.domain.endereco.Endereco;

import java.time.LocalDate;
import java.util.List;

public record DadosDetalhamentoBeneficiario(Long id, String nome, String telefone, LocalDate dataNascimento, LocalDate dataInclusao, LocalDate dataAtualizacao, List<Documento> documentos, Endereco endereco) {
    public DadosDetalhamentoBeneficiario(Beneficiario beneficiario){
        this(beneficiario.getId(), beneficiario.getNome(), beneficiario.getTelefone(), beneficiario.getDataNascimento(), beneficiario.getDataInclusao(), beneficiario.getDataAtualizacao(), beneficiario.getDocumentos(), beneficiario.getEndereco());
    }
}

Um dos atributos desse record é List<Documento> documentos, mas Documento é uma entidade JPA. Precisa criar outro record para representar o Documento e converter essa lista para ser uma lista desse record.

Bom, eu criei outro record, chamado "DadosDetalhamentoDocumento", que substitui o atributo que eu tinha colocado antes, que foi uma entidade JPA. Só que estou me confundindo um pouco na hora de converter essa lista.

package com.plano.saude.cadastro.domain.beneficiario;

import com.plano.saude.cadastro.domain.documento.DadosDetalhamentoDocumento;
import com.plano.saude.cadastro.domain.endereco.Endereco;

import java.time.LocalDate;
import java.util.List;

public record DadosDetalhamentoBeneficiario(
        Long id, 
        String nome, 
        String telefone, 
        LocalDate dataNascimento, 
        LocalDate dataInclusao, 
        LocalDate dataAtualizacao, 
        List<DadosDetalhamentoDocumento> documentos, 
        Endereco endereco) {
    public DadosDetalhamentoBeneficiario(Beneficiario beneficiario){
        this(
                beneficiario.getId(), 
                beneficiario.getNome(), 
                beneficiario.getTelefone(), 
                beneficiario.getDataNascimento(),
                beneficiario.getDataInclusao(), 
                beneficiario.getDataAtualizacao(), 
                beneficiario.getDocumentos(), **//Estou tomando um erro de compilação nessa linha**
                beneficiario.getEndereco()
        );
    }
}

E na classe Beneficiário (JPA), eu adicionei o construtor abaixo: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

E nas classes Documento e Endereco, eu adicionei os construtores. Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

solução!

No record, na linha que está dando erro, você deve converter o List<Documento> para List<DadosDetalhamentoDocumento>:

beneficiario.getDocumentos().stream().map(DadosDetalhamentoDocumento::new).toList(),

Para esse código funcionar seu record DadosDetalhamentoDocumento precisa ter esse construtor:

public DadosDetalhamentoDocumento(Documento documento) {
    this(passe aqui os atributos do documento para o record...);
}

Obs: Se no seu record DadosDetalhamentoDocumento tiver algum atributo que seja uma entidade JPA, vai precisar fazer a mesma coisa, criar um DTO e converter de entidade para DTO.

Resolvido, professor. Encontrei o mesmo problema em outra classe para ajustar em outro cenário e acabei de testar. Obrigado!