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

[Dúvida] Requisição do PUT

Boa tarde,

Estava colocando minha requisição PUT seguindo estas aulas como modelo, porém quando vou chamar o método getReferenceById() ele não aparece esta opção. Então tentei pelo metodo findById(), mas tambem não esta dando certo... Segue o trecho do código. A diferença do meu projeto é que estou usando MongoDB ao invés de MySQL igual na aula.

@PutMapping
@Transactional
public void atualizar(@RequestBody @Valid dadosAtualizacaoPaciente dados){
    var paciente = repository.findById(dados.id());
    paciente.get().atualizarInformacoes(dados);
}

O projeto até roda, mas a requisição PUT não funciona apesar de aparece 200OK.... as outras requisições estão funcionando. Se puderem me ajudar já tentei muitas coisas, mas não consegui resolver.

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
10 respostas

Oi Victor!

Posta aqui o código da sua interface repository.

Irei subir hoje no git ai já disponibilizo tambem aqui depois...

import CalendarioFinanceiro.Samantha.paciente.paciente;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface pacienteRepository extends MongoRepository<paciente, String> {

}

Pela interface que está sendo herdada, MongoRepository, tem o método findById que deve ser utilizado para buscar por id.

Qual problema ocorreu com esse método?

Este método até funciona. Ele acha o Id, porem quando tento "salvar" as alterações utilizando o método da Classe o request é enviado (200OK), mas não há alteração nenhuma.

Entendi. Talvez seja alguma questão em relação ao MongoDB mesmo.

Tenta chamar o save para ver se ele executa o update no banco:

@PutMapping
@Transactional
public void atualizar(@RequestBody @Valid dadosAtualizacaoPaciente dados){
    var paciente = repository.findById(dados.id());
    paciente.get().atualizarInformacoes(dados);

    repository.save(paciente);
}

Não deu certo... aparece um erro que nem me deixa rodar o código. Segue abaixo a mensagem que aparece:



Inferred type 'S' for type parameter 'S' is not within its bound; should extend 'CalendarioFinanceiro.Samantha.paciente.paciente'

No seu repository você herdou a interface MongoRepository<paciente, String>.

O id da sua entidade é uma String mesmo? Quando for chamar o método findById vai precisar passar como parâmetro uma String então.

Sim, esta tudo certo meu id esta como String.

Observei aqui que a var paciente esta como Optinoal. Então por mais que dou o comando get() parece que chama o método da classe paciente, mas não executa a alteração.

Interessante que quando eu coloquei o método get() mesmo sendo optional deu certo nesta requisição GET para chamar apenas os cadastros ativos.

@DeleteMapping("/{id}")
    @Transactional
    public void desativar(@PathVariable String id){
        var paciente = repository.findById(id);
        paciente.**get()**.desabilitar();
    }
solução!

Bom dia!

Consegui resolver aqui. Modifiquei o tipo do método atualizarInformacoes para dadosAtualizacaoPaciente e quando dou um repository.save(paciente.get()) funciona e a alteração vai para o banco. Segue o código:

@PutMapping("/{id}")
    @Transactional
    public void atualizar(@PathVariable("id") String id, @RequestBody @Valid dadosAtualizacaoPaciente dados){
        var paciente = repository.findById(id);
        if (paciente.isPresent()) {
           paciente.get().atualizarInformacoes(dados);
        }
        repository.save(paciente.get());
    }

e a alteração do método:


    public dadosAtualizacaoPaciente atualizarInformacoes(dadosAtualizacaoPaciente dados){
        System.out.println(dados);
        if (dados.telefone() != null) {
            this.telefone = dados.telefone();
        }
        if (dados.email() != null) {
            this.email = dados.email();
        }
        if (dados.estadoCivil() != null) {
            this.estadoCivil = dados.estadoCivil();
        }
        if (dados.endereco() != null) {
            this.endereco.atualizarInformacoes(dados.endereco());
        }
        return dados;
        }

Obrigado pela ajuda!