2
respostas

[Dúvida] Erro ao atualizar no banco de dados PUT

Ao tentar executar o PUT no Insomnia retorna o seguinte erro:

"status": 500, "error": "Internal Server Error", "trace": "java.lang.NullPointerException: Cannot invoke "med.voll.clinicavoll.endereco.DadosEnderecos.logradouro()" because "dados" is null\r\n\tat med.voll.clinicavoll.endereco.Endereco.atualizarInformacoes(Endereco.java:45)\r\n\tat

no terminal: java.lang.NullPointerException: Cannot invoke "med.voll.clinicavoll.endereco.DadosEnderecos.logradouro()" because "dados" is null

Abaixo a os métodos:

Classe médico

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

Classe endereço:

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

Record DadosEndereco

public record DadosEnderecos(
        @NotBlank
        String logradouro,

        @NotBlank
        String bairro,

        @NotBlank
        @Pattern(regexp = "\\d{8}")
        String cep,

        @NotBlank
        String cidade,

        @NotBlank
        String uf,

        String numero,
        String complemento) {
}

Método do controller

    @PutMapping
    @Transactional
    public void atualizar(@RequestBody @Valid DadosAtualizacaoMedico dados){
        var medico = medicoRepository.getReferenceById(dados.id());
        medico.atualizarInformacoes(dados);
    }
2 respostas

Olá, Fábio.

Tudo bem?

Pelo erro que você está recebendo, parece que o objeto dados está nulo quando você tenta acessar o método logradouro() na classe Endereco. Isso sugere que o objeto dados passado para o método atualizarInformacoes da classe Endereco não está sendo inicializado corretamente.

Aqui estão alguns pontos que você pode verificar para resolver esse problema:

  • Verifique se o objeto dados está sendo passado corretamente: Certifique-se de que o objeto DadosAtualizacaoMedico que você está passando para o método atualizarInformacoes na classe Médico contém um objeto DadosEnderecos não nulo. Eu notei que diferente da aula, você está utilizando DadosEnderecos no plural, verifica se está no plural certinho em todos os lugares do código.

  • Verifique o objeto enviado na requisição PUT: Certifique-se de que o JSON enviado na requisição PUT contém todos os campos necessários, incluindo o objeto endereco. Um exemplo de JSON válido seria:

{
    "id": 1,
    "nome": "Dr. João",
    "telefone": "123456789",
    "endereco": {
        "logradouro": "Rua A",
        "bairro": "Centro",
        "cep": "12345678",
        "cidade": "São Paulo",
        "uf": "SP",
        "numero": "100",
        "complemento": "Apto 202"
    }
}
  • Validação dos dados: Certifique-se de que as anotações de validação estão corretas e que todos os campos obrigatórios estão sendo enviados na requisição.

Espero ter ajudado. Qualquer dúvida manda aqui. Bons estudos.

Oi!

O seu método atualizar informações, na classe Medico:

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

Os ifs estão verificando os atributos, ao inves do parâmetro dados. Código correto:

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());
    }
}

Mesma coisa na classe Endereco.