Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

NullPoiterExeption JPA Repository - Repositpory null

Bom dia!

Estou recebendo um NullPoiterExeption em aplicação API Rest , fiz um CRUD simples e quando utilizo o Postman e dou um GET na aplicação recebo esse Exeption , pensei, tenho que criar então dei um POST e também deu um Exeption com a informação " because \ "this.repository" is null.

Status : 500 Erro: "Internal serve Erro"

Obs: Na IDE Intellij não teve problema , porem no Eclipse e STS deu esse Exeption isso no meu computador pessoal. O da empresa o Eclipse e STS rodaram meu código .

Ele informa que o método a seguir , o retorno com o findAll está devolvendo um null .

Outra observação quando coloco no retorno um List.of() ele me retorna uma lista vazia e status 200.

(Deixei o código completo que roda na aplicação Postman sem erro pelo intellij e não roda no Eclipse , STS)


@RestController
@AllArgsConstructor
public class CarroController {

 Repository repository

 @GetMapping("/carro")
 public List<Carro> getAllCarro() {
   return repository.findAll()
   }
}

@Entity // entidade JPA para salvar as informações no banco de dados h2
@Data
@AllArgsConstructor // com parametro
@NoArgsConstructor // sem parametro
public class Carro {

 @Id
 @GeneratedValue(strategy = GenerationType.AUTO) // gera de forma automatica
 Long id;
 String marca;
 String modelo;
 Integer ano;

}

public interface CarroRepository extends JpaRepository<Carro, Long> {
 // O JpaRepository estabelece a ligação entre as classes do modelo(entidades)
 // e o banco de dados h2

}

Será que é alguma configuração na minha IDE , por favor me ajude estou ficando doido!!!!!

5 respostas
solução!

Olá, Ivan! Como vai?

Entendo sua frustração, problemas como esse podem ser bem desafiadores. Mas não se preocupe, vamos tentar resolver isso juntos.

Pelo que você descreveu, parece que o problema está na injeção de dependência do seu repositório. Você mencionou que está usando a anotação @AllArgsConstructor na sua classe CarroController, mas não está usando a anotação @Autowired para injetar o repositório.

No Spring, quando você quer que o framework injete uma dependência para você, você precisa usar a anotação @Autowired. Isso diz ao Spring: "Ei, eu preciso de uma instância dessa classe, pode me dar uma?".

No seu caso, parece que você está tentando injetar uma instância de Repository em CarroController, mas não está usando a anotação @Autowired. Isso pode estar causando o NullPointerException, porque o Spring não sabe que precisa injetar uma instância de Repository para você.

Tente alterar seu código para algo assim:

@RestController
@AllArgsConstructor
public class CarroController {

  @Autowired
  private CarroRepository carroRepository;

  @GetMapping("/carro")
  public List<Carro> getAllCarro() {
    return carroRepository.findAll();
  }
}

Note que eu mudei o tipo de Repository para CarroRepository. Isso é porque você quer que o Spring injete uma instância de CarroRepository, não uma instância de Repository.

Espero que isso resolva o problema para você. Mas, lembre-se, essa é apenas uma sugestão e pode não ser a solução perfeita para o seu problema específico.

Grande abraço e bons estudos!

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

Boa tarde! Nossa muito obrigado, deu certo o erro subiu e meu método http deu certo.

Curiosidade porque no Intellij na minha maquina pessoal , não precisei colocar o @Autowired e rodou normal , ele entendeu o que eu queria ? e porque no computador da empresa ele também não teu problema mesmo sendo no eclipse e STS .? kkkkk vai enetender , mais eu queria kkkk!.

Desde já muito obrigado professor !!!!!!

Boa tarde , apareceu outro problema , na interface do Postman , não dá erro , porem não aparece nada .!Interface do postman com apenas chaves sem a informação pedido pelo Get

Esse é o código atual !

@Autowired RepositoryCarro RepositoryCarro;

@GetMapping("/carro")
public List<Carro> getAllCarro() {
   return RepositoryCarro.findAll();


}
@GetMapping("/carro/{id}")
public Optional<Carro> getByIdCarro(@PathVariable Long id){
    return RepositoryCarro.findById(id);
}

@PostMapping("/carro")
public Carro saveCarro(@RequestBody Carro carro) {
    return RepositoryCarro.save(carro);
}


@DeleteMapping("/carro/{id}")
public void deleteCarro(@PathVariable Long id) {
    RepositoryCarro.deleteById(id);
}

Opa, Ivan!

Pelo que eu posso ver no trecho de código que você compartilhou, não há nenhuma inconsistência ou problema nele que poderia causar essa situação.

Contudo, a requisição GET do seu Postman está retornando uma lista de objetos vazios. Isso significa que provavelmente você cadastrou 5 carros sem passar nenhum parâmetro, como, nome, modelo ou ano. Então tente realizar o cadastro de outro carro, mas lembre-se de alterar o método HTTP para POST, clique na opção que destaco no print abaixo para selecionar o método POST:

Botão de opções de métodos do Postman

Caso você tenha cadastrado e mesmo assim quando você busca todos os carros ainda esteja retornando uma lista vazia de objetos, peço que compartilhe todo o seu código, via GitHub ou Drive do Google. Para que eu realize testes.

Grande abraço!