2
respostas

Erro "this.categoriaRepository is null" ao salvar a classe "Categoria.java".

Bom dia,

Estou tentando realizar o desafio contido no link: https://cursos.alura.com.br/course/java-persistencia-dados-consultas-spring-data-jpa/task/174959
Porém não estou conseguindo solucionar a linha do erro " Cannot invoke "br.com.alura.gerenciador_pedidos.repository.CategoriaRepository.saveAll(java.lang.Iterable)" because "this.categoriaRepository" is null"
contido nos logs:

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2025-09-30T05:51:02.524-03:00 ERROR 27204 --- [ main] o.s.boot.SpringApplication : Application run failed

java.lang.IllegalStateException: Failed to execute CommandLineRunner
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:774) ~[spring-boot-3.1.1.jar:3.1.1]
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:755) ~[spring-boot-3.1.1.jar:3.1.1]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:319) ~[spring-boot-3.1.1.jar:3.1.1]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-3.1.1.jar:3.1.1]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-3.1.1.jar:3.1.1]
at br.com.alura.gerenciador_pedidos.GerenciadorPedidosApplication.main(GerenciadorPedidosApplication.java:25) ~[classes/:na]
Caused by: java.lang.NullPointerException: Cannot invoke "br.com.alura.gerenciador_pedidos.repository.CategoriaRepository.saveAll(java.lang.Iterable)" because "this.categoriaRepository" is null
at br.com.alura.gerenciador_pedidos.principal.Principal.principal(Principal.java:88) ~[classes/:na]
at br.com.alura.gerenciador_pedidos.GerenciadorPedidosApplication.run(GerenciadorPedidosApplication.java:34) ~[classes/:na]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:771) ~[spring-boot-3.1.1.jar:3.1.1]
... 5 common frames omitted

As tabelas categoria, produto e pedido from criadas normalmente no "PosGreSql"
O projeto esta no meu git https://github.com/Adelmo2/gerenciador-pedidos  (gerenciamento-pedidos 30/09/2025)

Por favor, Alguém poderia me passar uma dica de como solucionar ?

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
2 respostas

Bom dia, Adelmo! Como vai?

O problema está relacionado ao fato de que o categoriaRepository está nulo no momento em que você tenta usá-lo. Isso geralmente ocorre quando o Spring não consegue injetar a dependência corretamente. Aqui estão algumas dicas que podem ajudar a resolver esse problema:

  1. Verifique a Injeção de Dependência: Certifique-se de que o CategoriaRepository está sendo injetado corretamente na sua classe. Se você estiver usando a anotação @Autowired, verifique se ela está presente e corretamente aplicada na classe onde você está tentando usar o categoriaRepository. Por exemplo:

    @Autowired
    private CategoriaRepository categoriaRepository;
    
  2. Anotações de Repositório: Certifique-se de que sua interface CategoriaRepository está anotada com @Repository ou que está sendo escaneada pelo Spring como um repositório. O Spring Data JPA geralmente não requer a anotação @Repository, mas é importante garantir que o pacote onde o repositório está localizado está sendo escaneado pelo Spring.

Espero que essas dicas ajudem a resolver o problema. Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Bom dia Armando,

Obrigado pelo retorno.

Fiz as 2 verificações (dicas) que Você me passou mas, o erro "this.categoriaRepository" is null" continua persistindo.
Por favor, Você poderia informar a terceira verifição ?

**Referente a Verificação (1): **

package br.com.alura.gerenciador_pedidos.principal;

import br.com.alura.gerenciador_pedidos.model.Categoria;
import br.com.alura.gerenciador_pedidos.model.Produto;
import br.com.alura.gerenciador_pedidos.repository.CategoriaRepository;
import br.com.alura.gerenciador_pedidos.repository.ProdutoRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class Principal {

@Autowired
private CategoriaRepository categoriaRepository;

@Autowired
private ProdutoRepository produtoRepository;

public CategoriaRepository getCategoriaRepository() {
    return categoriaRepository;
}

public void setCategoriaRepository(CategoriaRepository categoriaRepository) {
    this.categoriaRepository = categoriaRepository;
}

public void principal() {
    // Criando categorias
    Categoria categoriaEletronicos = new Categoria(1L, "Eletrônicos");
    Categoria categoriaLivros = new Categoria(2L, "Livros");

    // Criando produtos e associando às categorias
    Produto produto1 = new Produto("Notebook", 3500.0, categoriaEletronicos);
    Produto produto2 = new Produto("Smartphone", 2500.0, categoriaEletronicos);
    Produto produto3 = new Produto("Livro de Java", 100.0, categoriaLivros);
    Produto produto4 = new Produto("Livro de Spring Boot", 150.0, categoriaLivros);

    // Associando produtos às categorias
    //categoriaEletronicos.
    categoriaEletronicos.setProdutos(List.of(produto1, produto2));
    categoriaLivros.setProdutos(List.of(produto3, produto4));

    // Salvando categorias (cascateia produtos automaticamente, se configurado)
    categoriaRepository.saveAll(List.of(categoriaEletronicos, categoriaLivros));

    // Testando a persistência e o relacionamento
    System.out.println("Categorias e seus produtos:");
    categoriaRepository.findAll().forEach(categoria -> {
        System.out.println("Categoria: " + categoria.getNome());
        categoria.getProdutos().forEach(produto ->
                System.out.println(" - Produto: " + produto.getNome())
        );
    });
    
    // Testando consultas e verificando os relacionamentos
    System.out.println("Produtos na categoria Eletrônicos:");
    categoriaRepository.findById(1L).ifPresent(categoria ->
            categoria.getProdutos().forEach(produto ->
                    System.out.println(" - " + produto.getNome())
            )
    );
}

}

Referente a verificação (2):
package br.com.alura.gerenciador_pedidos.repository;

import br.com.alura.gerenciador_pedidos.model.Categoria;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface CategoriaRepository extends JpaRepository<Categoria, Long> {}

Classe Categoria
package br.com.alura.gerenciador_pedidos.model;
import jakarta.persistence.*;
import java.util.List;

@Entity
public class Categoria {
@Id
private Long id;

private String nome;

@OneToMany(mappedBy = "categoria", cascade = CascadeType.ALL)
private List<Produto> produtos;

Categoria() {}

public void setId(Long id) {
    this.id = id;
}

public void setNome(String nome) {
    this.nome = nome;
}

public Categoria(Long id, String nome) {
    this.id = id;
    this.nome = nome;
}

public Long getId() {
    return id;
}

public String getNome() {
    return nome;
}

public List<Produto> getProdutos() {
    return produtos;
}

public void setProdutos(List<Produto> produtos) {
    produtos.forEach(p -> p.setCategoria(this));
    this.produtos = produtos;
}

}

Complementos
Classe GerenciadorPedidosApplication

import br.com.alura.gerenciador_pedidos.principal.Principal;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class GerenciadorPedidosApplication implements CommandLineRunner {

public static void main(String[] args) {
    SpringApplication.run(GerenciadorPedidosApplication.class, args);
}

@Override
public void run(String... args) throws Exception {
    Principal principal = new Principal();
    principal.principal();
}

}

//////////