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

Não retorna endereço dos médicos

Bom dia pessoal.

Estou fazendo a requisição GET do "Detralhar Medico", quando disparo a requisição o endereço não é retornado. Perceba que o id do médico é 1 Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Quando faço a requisição GET, para mostrar o "Detalhar medicos", ele retorna os resultados, porém sem o endereço Insira aqui a descrição dessa imagem para ajudar na acessibilidadeEssa é a classe o detalhar

@GetMapping("/{id}")

//mudar o void, retorno padrão para um retorno com código 204 - requisição processada sem conteudo //Trocar o void por ResponseEntity que é do próprio Spring public ResponseEntity detalhar(@PathVariable Long id){ var medico = repository.getReferenceById(id); System.out.println("ID"+ id); System.out.println("DADOS MEDICO" + new DadosDetalhamentoMedico(medico));

    System.out.println("DADOS ENDERECO" + medico.getEndereco());

//Para retornar os dados do medico pelo id o return deve ser assim*//
    return ResponseEntity.ok(new DadosDetalhamentoMedico(medico));

}

Coloquei um System.out.println, e o retorno foi esse

DADOS MEDICODadosDetalhamentoMedico[id=1, nome=Mauricio Mendes, email=mauricio.mendes@voll.med, crm=111226, telefone=99632179, especialiedade=CARDIOLOGIA, endereco=med.voll.api.endereco.Endereco@3d6c27c9]

Notem que o retorno do endereço, veio dessa forma endereco=med.voll.api.endereco.Endereco@3d6c27c9]

O Metodo Medico está assim:

public Medico(DadosCadastroMedicos dados) {
    this.ativo = true;
    this.nome = dados.nome();
    this.email = dados.email();
    this.telefone = dados.telefone();
    this.crm = dados.crm();
    this.especialiedade = dados.especialidade();
    this.endereco = new Endereco(dados.endereco());//estanciar a classe endereço e na classe Endereço criar um construtor que recebe como dados.endereco
}

e a classe Endereço está assim:

package med.voll.api.endereco;

import jakarta.persistence.Embeddable; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor;

@Embeddable //notação para referenciar que os dados do indereço serão armazenados na mesma tabela @NoArgsConstructor // criar o construtor padrão sem argumentos que a JPA exige @AllArgsConstructor // cria um construtor que cria todos os campos public class Endereco {

private String logradouro;
private String bairro;
private String cep;
private String numero;
private String complemento;
private String cidade;
private String uf;

public Endereco(DadosEndereco dados) {
    //this é para dizer que é para receber os dados das vaiávei criada a cima, as private
    this.logradouro = dados.logradouro();
    this.bairro = dados.bairro();
    this.cep = dados.cep();
    this.numero = dados.numero();
    this.complemento = dados.complemento();
    this.cidade = dados.cidade();
    this.uf = dados.uf();

}

Alguém saberia me dizer qual é o problema?

Obrigado
8 respostas

esse construtor aqui esta setando os valores do endereco?

return ResponseEntity.ok(new DadosDetalhamentoMedico(medico));

Sim

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

Esse método eu vi. Mas precisa ver o que acontece dentro do construtor. Se esse consturtor nao esta setando os dados do endereco o problema está ai.

Essa é a Classe Medico

@Table(name = "medicos") // notações JPA da Tabela
@Entity(name = "Medico") // Notação da Entidade Medico(classe java)
@Getter // notações do Lombok
@NoArgsConstructor // criar o construtor padrão sem argumentos que a JPA exige
@AllArgsConstructor // cria um construtor que cria todos os campos
@EqualsAndHashCode(of = "id")
public class Medico {

    @Id //chave primaria do banco
    @GeneratedValue(strategy =  GenerationType.SEQUENCE, generator ="seqMedicos") // chamar a sequence do banco de dados
    @SequenceGenerator(name = "seqMedicos", sequenceName = "SEQ_MEDICOS",allocationSize = 1) // chamar a sequence do banco de dados

    private Long id;
    private String nome;
    private String email;
    private String crm;
    private String telefone;
    private Boolean ativo;
    @Enumerated(EnumType.STRING)
    private Especialiedade especialiedade; //aqui é referenciado a calsse enum Especialiedades

    @Embedded // Siginifica que são de classes diferentes, mas serão armazenada na mesma tabela. Tem que ter a messa notação na classe Endereco
    // na classe Enderecos a notação deve ser @Embeddable
    private Endereco endereco; // criar a classe endereço dentro da pasta endereços

    public Medico(DadosCadastroMedicos dados) {
        this.ativo = true;
        this.nome = dados.nome();
        this.email = dados.email();
        this.telefone = dados.telefone();
        this.crm = dados.crm();
        this.especialiedade = dados.especialidade();
        this.endereco = new Endereco(dados.endereco());//estanciar a classe endereço e na classe Endereço criar um construtor que recebe como dados.endereco
    }

    public void atualizarInformacoes(DadosAtualizacaoMedico dados) {
        if (dados.nome() != null) {
            this.nome = dados.nome();
        }

        if (dados.telefone() != null){
            this.telefone = dados.telefone();
        }

        if (dados.endereco() != null){
            this.endereco.atualizarInformacoes(dados.endereco());
        }
    }

    public void excluir() {
        this.ativo = false;
    }
}

E esse é a classe Endereço

@Embeddable //notação para referenciar que os dados do indereço serão armazenados na mesma tabela
@NoArgsConstructor // criar o construtor padrão sem argumentos que a JPA exige
@AllArgsConstructor // cria um construtor que cria todos os campos
public class Endereco {

    private String logradouro;
    private String bairro;
    private String cep;
    private String numero;
    private String complemento;
    private String cidade;
    private String uf;

    public Endereco(DadosEndereco dados) {
        //this é para dizer que é para receber os dados das vaiávei criada a cima, as private
        this.logradouro = dados.logradouro();
        this.bairro = dados.bairro();
        this.cep = dados.cep();
        this.numero = dados.numero();
        this.complemento = dados.complemento();
        this.cidade = dados.cidade();
        this.uf = dados.uf();

    }

    public void atualizarInformacoes(DadosEndereco dados) {
if(dados.logradouro() != null) {
    this.logradouro = dados.logradouro();
}
if(dados.bairro() != null) {
    this.bairro = dados.bairro();
}
        if(dados.cep() != null) {
            this.cep = dados.cep();
        }
        if(dados.numero() != null) {
            this.numero = dados.numero();
        }
        if (dados.complemento() != null) {
            this.complemento = dados.complemento();
        }
        if (dados.cidade() != null) {
            this.cidade = dados.cidade();
        }
        if (dados.uf() != null) {
            this.uf = dados.uf();
        }


    }
}

Oi!

Seu método detalhar no controller tem essa linha:

return ResponseEntity.ok(new DadosDetalhamentoMedico(medico));

Ou seja, está devolvendo um json que é representado pelo DTO DadosDetalhamentoMedico. Manda aqui o código desse seu DTO.

Sim, tem essa linha. Segue o DOT


package med.voll.api.domain.medico;

import med.voll.api.domain.endereco.Endereco;

//Criar o record não recebendo o objeto medico, mas sim parrando os parametros que deve ser retornado
public record DadosDetalhamentoMedico(Long id, String nome, String email, String crm, String telefone, Especialiedade especialiedade, Endereco endereco) {

    //criar um construtor
    public DadosDetalhamentoMedico(Medico medico){
  this(medico.getId(), medico.getNome(), medico.getEmail(), medico.getCrm(),medico.getTelefone(), medico.getEspecialiedade(), medico.getEndereco());

    }
}

Blz, no seu DTO tem o atributo do endereço.

Acho que o problema então está na sua classe Endereco que está sem a anotação @Getter do Lombok. Com isso o Spring, ao gerar o json, não consegue ler as informações, porque está sem os métodos getters na classe Endereco

solução!

Era isso mesmo. Obrigado