O repositório Spring Data JPA lança o ponteiro nulo

Oi pessoas, tenho que salvar dados no banco de dados, na parte de minha aplicação web de registar sugestões, na qual passo do programa rodando no servidor em html para o mysql. O problema é que quando chamo o método de salvar retorna erro de ponteiro nulo da classe servidor, que por sua vez tem uma instancia de uma interface que é instanciada por JpaRepository. O programa criou o schema no bc. de dados normal, mas se não coloco um try-catch dentro do método de cadastrar a aplicação trava. Eu sei que erro de ponteiro nulo ocorre quando tento chamar uma instancia que não foi inicializada , mas não faço ideia alguma isso se insere no meu projeto. Ao usar o thymeleaf, ele consegue passar do html pro java todos os atributos, incluindo o id, da forma certa, mas quando chama a exceção, sempre o exception lanca: java.lang.NullPointerException. Como poderia resolver isso?

Segue meu código abaixo:

@Controller
public class InicialControler {

Servicos fazer;

/*apenas metodo de pag. de sugestoes destacado*/
@RequestMapping("/sugestoes")
public @ResponseBody ModelAndView mostrarSugestao(Ficha fichar){
	
	ModelAndView mostrar = new ModelAndView();
	mostrar.setViewName("sugestao");
	mostrar.addObject("fichar", fichar);

Ficha fichando = new Ficha(fichar.getNome(), fichar.getEmail(), fichar.getSugestao());

	try {

fazer.cadastrar(fichando);
System.out.println(“foi salvo” );
}catch(Exception e) {
System.out.println( "NULL ==> " + e + " "+ fichar.toString());
System.out.println( fichando.toString());
}

	return mostrar;

}

}

@Repository
public interface RepositorioDados extends JpaRepository<Ficha, Long> {

}

@Entity
@Table (name = “fichamentos”)
public class Ficha implements Serializable{

/**	 *	 */
//private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)	//@Column(name = "id", unique = true)
public long id;

private String nome  ;

private String email ;

private String sugestao ;

public Ficha() {
	this.nome = "";
	this.email = "";
	this.sugestao = "";
}

public Ficha( @NotNull String nome, @NotNull String email, @NotNull String sugestao) {
	this.nome = nome;
	this.email = email;
	this.sugestao = sugestao;
}

/GETTERS E SETTERS/
}

@Service
public class Servicos implements GenericosServicos<Ficha, Long> {

RepositorioDados repositar;

@Override
public Optional<Ficha> buscarPorId(Long id) {
	return repositar.findById(id);
}

@Override
public Ficha cadastrar(Ficha t) {
	 return repositar.save(t);	
}

@Override
public Ficha alterar(Long k, Ficha t) {
	
	// TODO Auto-generated method stub
	return null;
}

@Override
public List<Ficha> ListarTodos() {
	return repositar.findAll();
}

@Override
public void deletar(Long k) {
	repositar.deleteById(k);
}

}

public interface GenericosServicos<T, K> {

public T cadastrar ( T t);	

public T alterar (K k, T t);

public void deletar (K k);

public Optional<T> buscarPorId  ( K id);

public List<T>  ListarTodos();

}

Faz algum tempo que não uso Spring, mas o erro pode estar no método construtor acima. Você deixou ele inicializado como vazio. Geralmente no construtor, mesmo quando não entramos com argumentos pelo método, precisamos apontar para as variáveis usando this:

this.nome = nome;

Não, continua dando o mesmo erro:

NULL ==> java.lang.NullPointerException Ficha [id=0, nome=nome, email=email, sugestao=sugestão]

Por que o seu id está igual a zero? :smiley: Assim como this.nome = nome precisamos de this.id = id.

Não mudou nada

Observe essa linha acima. Você está passando os getters, que já são da própria classe Ficha, como argumento do construtor da classe Ficha.

Não, é que essa a minha lógica: Tenho os objetos fichando e fichar. Basicamente, “fichar” são os dados que recebo lá no html, na qual recebo como parametro na classe ModelAndView. Depois, declaro que uma nova ficha é criada com base naquilo que recebo no html, e passo “fichando” pra ser salvo no mysql. Acho que daria certo se passasse “fichar” diretamente pra ser salvo, mas criei um objeto novo só pra garantir.

Entendo. Desculpe, mas nesse caso, acredito que não poderei te ajudar. Até mais! :blush: