Ao passar informações para outra api não está salvando as informações no banco de dados

3 respostas
guilhermebhte

Tem duas apis

Ao tentar passar informações para outra ela passa.

Mas ao tentar persistir dá erro, porque a api A, não salvou as informações no banco de dados que está indo para a api b

package br.com.ghnetsoft.gestorsistemas.fatura.client;

import java.util.Collection;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.HttpClientErrorException;

import br.com.ghnetsoft.gestorsistemas.fatura.dto.contareceber.FaturaContaReceberDTO;
import br.com.ghnetsoft.principal.exception.GeralException;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Component
public class ContaReceberClient extends BaseClient {

    private static final long serialVersionUID = -771119878551453674L;
    @Value("${url-conta-receber}")
    private String url;

    @Transactional
    public void fatura(final Collection<FaturaContaReceberDTO> faturas) {
        try {
            final String urlFinal = url + "fatura/";
            log.info("buscarPorId - urlFinal: " + urlFinal);
            getRestTemplate().postForEntity(urlFinal, new HttpEntity<>(faturas, getHeaders(true)), Object.class).getBody();
        } catch (final HttpClientErrorException e) {
            throw new GeralException(error(e));
        }
    }
}

Por mais que depurando no JAVA ele mostra o ID e no console do eclipse, ele mostra os inserts

Caused by: org.postgresql.util.PSQLException: ERROR: insert or update on table "tab_conta_receber" violates foreign key constraint "tab_conta_receber_fk_fatura_parcelada_fkey"
  Detalhe: Key (fk_fatura_parcelada)=(7e9af141-20a2-42cf-b1be-a4a733bcc8cf) is not present in table "tab_fatura_parcelada".
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2553)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2285)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:323)
	at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:473)
	at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:393)
	at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:164)
	at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:130)
	at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61)
	at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java)
	at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197)
	... 140 common frames omitted

3 Respostas

Jonathan_Medeiros

São 2 APIs que utilizam a mesma base de dados?

guilhermebhte

Sim. @Jonathan_Medeiros

Mas apis diferentes

Jonathan_Medeiros

Entendi, este erro provavelmente acontece porquê a transação ainda não foi concluída, a chamada para a API está dentro do escopo transacional e nesse momento ainda não houve o commit das mudanças, a segunda API abre uma nova transação e tenta persistir um dado que ainda não foi enviado ao banco de dados.

Você poderia fazer 2 testes para validar se o problema realmente é este:

  • Deixar a chamada da API 1 para a API 2 fora do escopo da transação.
  • Remover a restrição de FK da tabela em que a API 2 realiza a inserção.
Criado 3 de junho de 2023
Ultima resposta 3 de jun. de 2023
Respostas 3
Participantes 2