Como salvar dado no banco com SpringBoot fora da controller

12 respostas Resolvido
springspring-bootjavajpahibernate
G

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

12 Respostas

L

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?

G

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

L

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.

G

É 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);
	        }
L

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.

G

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

L

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.

G

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

L
Solucao aceita

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;
G

Deu certo!!! obrigada!

L

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!

J

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

Criado 30 de novembro de 2021
Ultima resposta 17 de mai. de 2023
Respostas 12
Participantes 3