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

Spring Boot Não Faz Injeção de Dependências

Olá, Estou desenvolvendo uma API Rest que cadastra clientes, porém, ao tentar persistir os dados, eu recebo a seguinte NullPointException:

java.lang.NullPointerException: Cannot invoke "br.com.syshotel.api.domain.clientes.PessoaFisicaRepository.save(Object)" because "this.pessoaFisicaRepository" is null
    

Esta é a classe PessoaFisica

package br.com.syshotel.api.domain.clientes;




@Entity
@Table(name="pessoa_fisica")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class PessoaFisica extends Cliente {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id;
    String nome;
    String cpf;
    @Column(name = "data_nascimento")
    LocalDate dataNascimento;

    public PessoaFisica(DadosCadastroPessoaFisica dados) {
        this.nome = dados.nome();
        this.cpf = dados.cpf();
        this.dataNascimento = dados.dataNascimento();
    }
}

Esta é a interface PessoaFisicaRepository

package br.com.syshotel.api.domain.clientes;

import org.springframework.data.jpa.repository.JpaRepository;

public interface PessoaFisicaRepository extends JpaRepository<PessoaFisica, Long> {
}

O DTO DadosCadastroClientes

package br.com.syshotel.api.domain.clientes;

import java.time.LocalDate;

public record DadosCadastroPessoaFisica(
        String nome,
        String cpf,

        LocalDate dataNascimento
) {
}

O Meu ClienteController

package br.com.syshotel.api.controller;




@RestController
@RequestMapping("/clientes")
public class ClienteController {

    @Autowired
    private PessoaFisicaRepository pessoaFisicaRepository;

    @PostMapping
    @Transactional
    private void cadastra(@RequestBody DadosCadastroPessoaFisica dados){
        var cliente  = new PessoaFisica(dados);
        System.out.println(dados.nome());
        System.out.println(dados.cpf());
        System.out.println(dados.dataNascimento());
        pessoaFisicaRepository.save(cliente);
    }
}

É como se a variável cliente que eu instanciei na classe controller, estivesse null. Mas, como vocês podem ver, eu sei um sysout nos dados da variável cliente e eles estão lá. É como se o Spring não tiversse fazendo as injeções de dendência, não sei falata alguma anotação... Alguém poderia me ajdar?

2 respostas
solução!

Olá Damião

Parece que o problema que você está enfrentando está relacionado à injeção de dependência não funcionando corretamente. A exceção NullPointerException que você está recebendo indica que this.pessoaFisicaRepository na classe ClienteController está sendo avaliado como nulo, o que significa que a injeção de dependência não está ocorrendo como esperado.

Aqui estão algumas coisas que você pode verificar para solucionar o problema:

  • Anotação @SpringBootApplication: Certifique-se de que a classe principal do seu aplicativo (geralmente anotada com @SpringBootApplication) esteja em um pacote base que inclua todas as outras classes relevantes. Isso garante que o Spring Boot possa detectar e gerenciar corretamente as classes e os componentes.

  • Component Scan: Verifique se o pacote que contém a classe ClienteController (e outras classes relevantes) está incluído na varredura de componentes do Spring. Isso pode ser feito usando a anotação @ComponentScan na classe de configuração principal ou garantindo que o pacote esteja abaixo do pacote onde a classe principal está localizada.

@SpringBootApplication
@ComponentScan(basePackages = "br.com.syshotel.api")
public class SuaAplicacaoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SuaAplicacaoApplication.class, args);
    }
}
  • Anotação @RestController: Certifique-se de que a classe ClienteController seja anotada com @RestController para que o Spring possa reconhecê-la como um controlador.

  • Visibilidade do método cadastra: Certifique-se de que o método cadastra na classe ClienteController tenha a visibilidade correta para ser acessado por uma solicitação HTTP. Geralmente, você deve usar public para tornar o método acessível.

@PostMapping
@Transactional
public void cadastra(@RequestBody DadosCadastroPessoaFisica dados) {
    // Seu código aqui
}
  • Injeção de Dependência: Verifique se a classe PessoaFisicaRepository está devidamente anotada com @Repository ou que a interface está estendendo JpaRepository corretamente.

  • Dependências Corretas: Certifique-se de que todas as dependências do Spring Boot estejam configuradas corretamente em seu projeto, incluindo o arquivo application.properties ou application.yml se você estiver usando alguma configuração personalizada.

Se, após verificar esses pontos, o problema ainda persistir, certifique-se de que todas as dependências do Spring Boot estejam configuradas corretamente em seu projeto e que não haja conflitos de versão entre as bibliotecas. Certifique-se também de que o pacote que contém as classes esteja sendo escaneado corretamente pelo Spring Boot. Se o problema persistir, fornecer mais informações sobre sua configuração e estrutura de projeto pode ajudar a identificar o problema com mais precisão.

Caso tenha dúvidas, fico à disposição!

Espero ter ajudado.

Abraços e bons estudos!

Olá SARAH CRISTINA BATISTA DOS SANTOS,

De fato era um problema de injeção de dependências. Eu já havia tentado essa questão da anotação @ComponentScan, e outras várias tentativas, mas nada adiantou. Foi então que eu reiniciei o projeto do zero, Fui instalando as dependências uma a uma, a medida em que ia precisando, a cada modificação significativa fui testando e funcionou. Eu consegui fazer a persistência utilizando o método save() do repository.

Eu acredito que tive este problema porque eu iniciei o projeto com várias dependências instaladas, dentre elas o Spring Data e o Fly-way, o que me obrigou, já na primeira inicialização do projeto, a criar a base de dados e as tabelas antes de criar as entidades. Aí acho que deve ter dado alguma "zica" no Spring que ele não consegui enxergar os componentes da aplicação. Depois de ter quebrado a cabeça por três dias, foi a conclusão que eu cheguei.

Obrigado.