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.

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!