Iniciando em Spring Boot, como corrigir o erro: Failed to convert value of type 'java.lang.String' to required type 'com.financasapp.models.Usuario

Olá,

Estou iniciando minha aprendizagem em Spring Boot e estou travado em um erro que não consigo resolver, já pesquisei em documentações e em diversos fóruns e não encontrei nada que pudesse me ajudar.

Estou tentando fazer uma ferramenta de controle de finanças, que esta da seguinte forma até o momento:

Model do usuario:

@Entity
public class Usuario {
	
	@Id
	@GeneratedValue (strategy=GenerationType.IDENTITY)
	private Long idusuario;
	
	private String usuario;
	private String senha;
	private float salario;

//metodos getters e setters

Controller:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.financasapp.models.Usuario;
import com.financasapp.repository.UsuarioRepository;

@Controller
public class CadastroController {

	@Autowired
	private UsuarioRepository gr;
	
	@RequestMapping(value="/cadastro", method=RequestMethod.GET)
	public String cadastro() {
		
		return "/cadastro";
	} 

	@RequestMapping(value="/cadastro", method=RequestMethod.POST)
	public String cadastro(Usuario usuario) {
	
		gr.save(usuario);
		
		return "redirect:/index";
	}

}

E meu repository:

import org.springframework.data.repository.CrudRepository;

import com.financasapp.models.Usuario;

public interface UsuarioRepository extends CrudRepository<Usuario, Long>{

}

view:

<!DOCTYPE html>
<html lang="pt">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<link rel="stylesheet" href="css/login.css">
<title>Cadastro</title>
</head>
<body class="container">
	
	<h1>Cadastro de Usuário</h1>
	
	<div class="row justify-content-center">
		<div class="col-6">
			<form method="POST">
			
				<div class="form-group">
					<label for="user">Usuario</label>
					<input type="text" class="form-control" name="usuario" value="" id="user" placeholder="Nome de usuario"> 
				</div>
				<div class="form-group">
					<label for="senha">Senha</label>
					 <input type="password" class="form-control" name="senha" value="" id="senha" placeholder="Sua senha">
				</div>
				
				<div class="form-group">
					<label for="salario">Salário</label>
					 <input type="number" class="form-control" name="salario" value="" id="salario" placeholder="ex: R$ 1000,00">
				</div>
		
				<button type="submit" class="btn btn-primary ">Cadastrar</button>
			</form>
		</div>
	</div>
</body>

<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
</html>

O problema ocorre ao inserir as informações no input e clicar no botão, ocorre o seguinte erro:

This application has no explicit mapping for /error, so you are seeing this as a fallback.

    Sun Jul 21 21:17:42 BRT 2019

    There was an unexpected error (type=Bad Request, status=400).

Failed to convert value of type 'java.lang.String' to required type 'com.financasapp.models.Usuario'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from ype [java.lang.String] to type [java.lang.Long] for value 'TESTE'; nested exception is java.lang.NumberFormatException: For input string: "TESTE"

org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'com.financasapp.models.Usuario'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.lang.Long] for value 'TESTE'; nested exception is java.lang.NumberFormatException: For input string: "TESTE"

a tabela do banco de dados esta exatamente igual ao model Usuario.

Acredito que ele não está conseguindo fazer o binding do seu form pro model Usuario.

Tenta colocar o input do campo id no seu formulário definido como hidden.

Já tentei e não deu. Pelo que eu notei, ele esta pegando o campo “usuario” do form e tentando usar como ID, pois eu cadastrei manualmente alguns usuarios no banco e no campo “usuario” do form se eu digito no campo “usuario” um id já existente no banco ele “funciona”, ele pega aquele ID digitado e faz um update no registro.

Interessante…

Quando eu tive esse problema foi por não conter no formulário todos os campos necessários para que o Spring fizesse o binding do mesmo, e também por colocar identificadores name e id diferentes para os inputs, mas no meu caso era utilizando Thymeleaf.