Metodo put atualizar erro 400

Ola, boa tarde!
Então estou com esse erro ai, alguém com esperiência para me ajudar?

No spring o metodo:

@PutMapping(path = { "/{id}" })
	public ResponseEntity<Cliente> atualizar(@PathVariable("id") Long id, @Valid @RequestBody Cliente cliente) {
		if (!cs.existsById(id)) {
			return ResponseEntity.notFound().build();
		}
		System.out.println(id);
		cliente.setId(id);
		cliente = cs.atualizar(cliente);
		return ResponseEntity.ok(cliente);
	}

No angular a url:


  updateCliente(cliente:Cliente){
    console.log(cliente);
     return this.http.put<Cliente>(this.url+"/"+cliente.id, cliente);
  }

Deve ter sido impresso no console uma stacktrace com o erro específico. Veja se tu acha e posta aqui pra gente ver.

Então Lucas, quando eu busco o cliente ele retorna e da esse erro: que deve ser referente ao dataNascimente, que ainda não esta cadastrando:

Porém: se tento atualizar ai, da o erro 400:

image

Achei um warn no servidor:

2021-07-23 16:56:52.635 WARN 15056 — [nio-8080-exec-5] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type ‘java.lang.String’ to required type ‘java.lang.Long’; nested exception is java.lang.NumberFormatException: For input string: “undefined”]

1 curtida

Isso que estava falando msm, mas achei que ia ter uma exception em vez de warning.

Nesse caso, ele não conseguiu converter o body da requisição. No console do navegador, na aba network, vc consegue inspecionar os dados da requisição e ver o que está sendo passado pro servidor. Veja qual campo está sendo enviado como undefined.

Como podes ver, na classe serviço ele passa um objeto:

image

Ah, reparei agora. O ID está sendo passado undefined na URL

Tem uma engembraçãozinha que faço com o id - no componente listar, eu pego um id do cliente que vem da tabela quando clico no botão editar, na tabela qu lista os clientes:

Atualizar(cliente:Cliente): void{
   // console.log(id);
    localStorage.setItem("id", cliente.id.toString());
    this.router.navigate(["editarcliente"]); 
  }

E no componente editar tenho que, conveter em number:

Atualizar(){
    let id= localStorage.getItem("id");
    var numberValue = Number(id);
    this.clienteService.getCientePorID(numberValue)

    
    .subscribe(data=>{  
      this.cliente=data;
      this.formulario = this.formBuilder.group({
        nome: [this.cliente.nome],
        cpf: [this.cliente.cpf],
        dataNascimento: [new Date().getDay()]
        //dataNascimento: [this.cliente.dataNascimento]
        })
    })
  }

Será que tem haver?

Como está a parte que realiza a requisição para alterar os dados do cliente?

O metodo de baixo vai no servidor e busca o cliente, porém quando uso o de cima acontece o erro:

updateCliente(cliente:Cliente){
    console.log(cliente);
     return this.http.put<Cliente>(this.url+"/"+cliente.id, cliente);
  }

 ////////////////////BUSCA CLIENTE PARA ATUALIZAR/////////////////

  getCientePorID(id:number){
    return this.http.get<Cliente>(this.url+"/"+id);
  }

Esse console imprime com o ID preenchido?

Não! botei outro mas deu undefinido:

updateCliente(cliente:Cliente){
    console.log(cliente);
    console.log(cliente.id);
     return this.http.put<Cliente>(this.url+"/"+cliente.id, cliente);
  }

image

O endpoint que retorna o cliente por ID está realmente retornando o ID na requisição?

Botei um console no editar que chama o metodo, e vem o 13:

image

Atualizar(){
    let id= localStorage.getItem("id");
    var numberValue = Number(id);
    this.clienteService.getCientePorID(numberValue)
    .subscribe(data=>{  
      this.cliente=data;
      this.formulario = this.formBuilder.group({
        nome: [this.cliente.nome],
        cpf: [this.cliente.cpf],
        dataNascimento: [new Date().getDay()]
        //dataNascimento: [this.cliente.dataNascimento]
        })

        
        console.log(this.cliente.id);
    })
  }

Solucionado, faltava atualizar o o formulário com o id, no metodo acima:

 id: [this.cliente.id],
1 curtida

Top! Nem tinha reparado nisso!

Pois é! Valeu Lucas obrigado!