Como salvar dado no banco com SpringBoot fora da controller

Queria saber como salvar dados no banco com spring boot sem usar a anotação @Post

Normalmente eu tenho uma controller com os endpoints onde eu chamo o repositoryTeste.save(dados), mas nesse caso eu estou lendo um arquivo txt e quero salvar esses dados lidos mas não sei como fazer

Então o gatilho do processamento do arquivo não será através de um endpoint http? Isso que vc quer fazer seria algum tipo de processamento batch? Pq vc quer fazer sem usar o @PostMapping?

Sim, não será atraves do endoint http, eu fiz um endpoint pra fazer upload de um arquivo onde leio os dados e armazeno em um array so que queria agora salvar esses dados no banco assim que eu ler-se o dado mas fiquei sem saber como eu iria chamar o metodo save() do spring senão fosse em um endpoint, ou se não tiver como fazer isso um jeito de chamar o endpoint de dentro do programa pra salvar

Olha, não sei se entendi 100%, mas parece que, logo após vc adicionar no array, vc quer, em um segundo momento, pegar os dados do array e salvar no banco. É isso? Se for, vc pode usar um @Schedule para executar um método a cada X tempo.

É isso mesmo, mas eu não precisaria executar isso em um tempo especifico bastava conseguir salvar

estou tentando fazer assim:

tenho esse arrayList chamdo lista onde vou percorrendo cada dado e adicionando no banco, so que não funciona

 @Autowired
 private ContratosRepository contratosRepository;

for (Contratos p1 : lista) {
	        	Contratos s = new Contratos ();
	        	s.setNome(p1.getNome());
	        	        	
	        	contratosRepository.save(s);
	        }

Mas se a execução não for iniciada através de um endpoint http, como ele iria ser iniciado? Ou vc quer executar sem endpoint apenas para testar mesmo.

mas se preciso de um endpoint pra salvar isso no banco como eu posso fazer pra chamar o endpoint dentro desse for?

Não precisa do endpoint para salvar. Basta chamar o repositorio mesmo. A questão é quem vai chamar o método que tem esse FOR.

Eu coloquei esse for logo em seguida da leitura do arquivo do upload ele lê o for sem problemas mas o save() não funciona

Experimente criar uma classe à parte e coloque esse FOR num método dessa classe, e coloque um @Transactional no método. Ex.:

@Service
public class ProcessadorService {

  @Transactional
  public void processar() {
    // coloque o FOR aqui e chame esse método da controller
  }
}

Na controller onde está o endpoint, faça a injeção assim:

@Autowired
private ProcessadorService processadorService;

Deu certo!!! obrigada!

1 curtida

Toda operação que irá causar mudança no banco (insert, update, delete) deve ser feita dentro de uma transação. E no spring, o ideal é vc ter uma classe que irá definir o escopo transacional (geralmente uma classe de serviço que é onde vc irá colocar possíveis regras negociais).

Que bom que deu certo!

1 curtida

Estou com esse msm problema irei tentar essa solução.
Obrigado