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

Persistência Jpa com Spring Boot

Olá, estou criando um controller para cadastrar clientes e a JPA está me devolvendo uma NullPointexception: Cannot invoke "syshotel.com.api.domain.cliente.CLientePjRepository.save(Object)" because "this.cLientePjRepository" is null. Segue abaixo a minha classe controller:

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

    @Autowired
    private ClientePfRepository clientePfRepository;

    @Autowired
    private CLientePjRepository cLientePjRepository;

    @Autowired
    private EnderecoRepository enderecoRepository;

    @Autowired
    private TelefoneRepository telefoneRepository;

    @PostMapping
    @Transactional
    private void cadastrar(@RequestBody DadosCadastroCliente dados){

        if(dados.isJuridico()){
            var clientePj = cLientePjRepository.save(new PessoaJuridica(dados.razaoSocial(), dados.nomeFatasia(), dados.cnpj(),
                    dados.email()));

            var endereco = dados.endereco();

            var telefone = dados.telefone();

            for (DadosEndereco item : endereco){
                var enderecoPj = new  Endereco(item, null, clientePj);
                enderecoRepository.save(enderecoPj);
            }

            for (DadosTelefone item : telefone){
                var telefonePj = new Telefone(item, null, clientePj);
                telefoneRepository.save(telefonePj);
            }


        } else if(!dados.isJuridico()){

            var clientePf = clientePfRepository.save(new PessoaFisica(dados.nome(), dados.dataNascimento(),
                    dados.cpf(), dados.rg(), dados.sexo(), dados.email()));

            var endereco = dados.endereco();

            var telefone = dados.telefone();

            for (DadosEndereco item : endereco){
                var enderecoPj = new  Endereco(item, clientePf, null);
                enderecoRepository.save(enderecoPj);
            }

            for (DadosTelefone item : telefone){
                var telefonePj = new Telefone(item, clientePf, null);
                telefoneRepository.save(telefonePj);
            }

        }


    }


}

No JSON vem informação se o cliente é Pj e o método cadastrar faz a verificção e pesiste de acordo com o tipo de cliente escolhido. Mandei o Seguinte JSON:

{
    "isJuridico": true,
    "razaoSocial": "Fábrica de Panelas S/A",
    "nomeFantasia": "Panelas de Ouro",
    "cnpj": "11111111111111111",
    "email": "financeiro@panelasdeouro.com.br",
    "endereco": [
        {
            "cep": "44444444",
            "logradouro": "Av das Panelas",
            "numero": "44",
            "bairro": "Centro",
            "cidade": "Taquarana",
            "estado": "AL"
        },
        {
            "cep": "55555555",
            "logradouro": "Av das Tampas",
            "numero": "77",
            "bairro": "Árvores",
            "cidade": "Taquarana",
            "estado": "AL"			
        }
    ]
    
}

Peso que eu entendi, é como se o objeto de vai no método save() do repository do cliente PJ, está NULL, mas ele foi instanciado e o o códico está compilando. Só na hora de cadastrar o cliente que vem esse erro. O que poderá ser?

2 respostas
solução!

Olá, Damião! Tudo bem?

Pelo que você descreveu e pelo código que você compartilhou, o problema parece estar relacionado à injeção de dependências do Spring Boot. A mensagem de erro indica que o objeto cLientePjRepository está nulo no momento em que o método save() é chamado.

Isso pode acontecer se o Spring Boot não estiver conseguindo injetar a dependência corretamente. Vou te dar algumas sugestões de como você pode tentar resolver isso:

1 - Verifique se a anotação @Repository está presente na interface CLientePjRepository. Essa anotação é necessária para que o Spring Boot reconheça essa interface como um repositório e possa injetar a dependência corretamente.

Exemplo:

@Repository
public interface CLientePjRepository extends JpaRepository<PessoaJuridica, Long> {
    // métodos do repositório
}

2 - Verifique se a anotação @SpringBootApplication (ou @EnableAutoConfiguration e @ComponentScan, que estão incluídas na @SpringBootApplication) está presente na classe principal do seu aplicativo. Essa anotação é responsável por ativar a injeção automática de dependências do Spring Boot.

3 - Verifique se o pacote onde a interface CLientePjRepository está localizada está sendo escaneado pelo Spring Boot. O Spring Boot escaneia automaticamente todos os subpacotes do pacote onde a classe principal do aplicativo está localizada. Se a interface CLientePjRepository estiver em um pacote que não é um subpacote do pacote da classe principal, você precisará adicionar a anotação @ComponentScan na classe principal e especificar o pacote da interface CLientePjRepository.

Por favor, tente essas sugestões e veja se alguma delas resolve o seu problema.

Espero ter ajudado e bons estudos!

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

Obrigado Armano Barros Alves Junior. Fiz todas as anotações que você sugeriu e funcionou.