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

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

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

1 curtida

Sim. @Jonathan_Medeiros

Mas apis diferentes

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.
1 curtida