Example usage for org.springframework.transaction.support TransactionCallbackWithoutResult TransactionCallbackWithoutResult

List of usage examples for org.springframework.transaction.support TransactionCallbackWithoutResult TransactionCallbackWithoutResult

Introduction

In this page you can find the example usage for org.springframework.transaction.support TransactionCallbackWithoutResult TransactionCallbackWithoutResult.

Prototype

TransactionCallbackWithoutResult

Source Link

Usage

From source file:com.hp.avmon.config.service.AgentManageService.java

public void transfer(final String[] sqls) throws Exception {
    final String trasactionFlag = "0";
    transactionTemplate.execute(new TransactionCallbackWithoutResult() {
        protected void doInTransactionWithoutResult(TransactionStatus status) {
            try {
                // JdbcTemplate batchUpdate?
                jdbcTemplate.batchUpdate(sqls);
            } catch (Exception e) {
                System.out.println("----------RuntimeException-----" + e);
                status.setRollbackOnly(); // 
            }/* ww w.  j av  a 2s .co  m*/
        }
    });
}

From source file:database.DataLoader.java

private void moveAuthorReject() throws Exception {
    final String tableName = AUTHOR_REJECT;
    final ResultSet set = getFromOldBase(getSelectAll(tableName));
    final List<AuthorReject> allList = authorRejectDao.getAll();
    while (set.next()) {

        TransactionTemplate temp = new TransactionTemplate(transactionManager);
        temp.execute(new TransactionCallbackWithoutResult() {

            @Override/*from www . j  ava 2  s  . c om*/
            protected void doInTransactionWithoutResult(TransactionStatus ts) {
                String st = "";
                try {
                    Long oldAuthorId = set.getLong("author_id");
                    Long oldOrderId = set.getLong("order_id");
                    Long newAuthorId = getNewId(oldAuthorId, USERS);
                    Long newOrderId = getNewId(oldOrderId, ORDER);
                    st = "oldAuth" + oldAuthorId + " oldOrd" + oldOrderId + " newAuth" + newAuthorId + " newOrd"
                            + newOrderId;
                    Author author = getAuthor(newAuthorId);
                    Order order = getOrder(newOrderId);
                    AuthorReject authorReject = new AuthorReject();
                    authorReject.setAuthor(author);
                    authorReject.setOrder(order);
                    if (!exist(allList, author, order)) {
                        authorRejectDao.save(authorReject);
                    }
                } catch (Exception e) {
                    ts.setRollbackOnly();
                    addErrorMessage("moveAuthorReject: " + st + StringAdapter.getStackExeption(e));
                    log.warn("moveAuthorReject: " + st + StringAdapter.getStackExeption(e));
                }
            }
        });

    }
}

From source file:nl.ordina.bag.etl.dao.AbstractBAGDAO.java

@Override
public void update(final Verblijfsobject verblijfsobject) throws DAOException {
    try {/*ww w .j a  v  a 2 s . c  om*/
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                jdbcTemplate.update(new PreparedStatementCreator() {
                    @Override
                    public PreparedStatement createPreparedStatement(Connection connection)
                            throws SQLException {
                        PreparedStatement ps = connection.prepareStatement("update bag_verblijfsobject set"
                                + " aanduiding_record_inactief = ?," + " officieel = ?,"
                                + " verblijfsobject_geometrie = ?," + " oppervlakte_verblijfsobject = ?,"
                                + " verblijfsobject_status = ?," + " einddatum_tijdvak_geldigheid = ?,"
                                + " in_onderzoek = ?," + " bron_documentdatum = ?,"
                                + " bron_documentnummer = ?," + " bag_nummeraanduiding_id = ?"
                                + " where bag_verblijfsobject_id = ?" + " and aanduiding_record_correctie = ?"
                                + " and begindatum_tijdvak_geldigheid = ?");
                        ps.setInt(1, verblijfsobject.getAanduidingRecordInactief().ordinal());
                        ps.setInt(2, verblijfsobject.getOfficieel().ordinal());
                        ps.setString(3, verblijfsobject.getVerblijfsobjectGeometrie());
                        ps.setInt(4, verblijfsobject.getOppervlakteVerblijfsobject());
                        ps.setInt(5, verblijfsobject.getVerblijfsobjectStatus().ordinal());
                        if (verblijfsobject.getEinddatumTijdvakGeldigheid() == null)
                            ps.setNull(6, Types.TIMESTAMP);
                        else
                            ps.setTimestamp(6,
                                    new Timestamp(verblijfsobject.getEinddatumTijdvakGeldigheid().getTime()));
                        ps.setInt(7, verblijfsobject.getInOnderzoek().ordinal());
                        ps.setDate(8, new Date(verblijfsobject.getDocumentdatum().getTime()));
                        ps.setString(9, verblijfsobject.getDocumentnummer());
                        ps.setLong(10, verblijfsobject.getHoofdAdres());
                        ps.setLong(11, verblijfsobject.getIdentificatie());
                        ps.setLong(12, verblijfsobject.getAanduidingRecordCorrectie());
                        ps.setTimestamp(13,
                                new Timestamp(verblijfsobject.getBegindatumTijdvakGeldigheid().getTime()));
                        return ps;
                    }
                });
                deleteGebruikersdoelen(verblijfsobject);
                insertGebruikersdoelen(verblijfsobject);
                deleteNevenadressen(TypeAdresseerbaarObject.VERBLIJFSOBJECT, verblijfsobject);
                insertNevenadressen(TypeAdresseerbaarObject.VERBLIJFSOBJECT, verblijfsobject);
                deleteGerelateerdePanden(verblijfsobject);
                insertGerelateerdePanden(verblijfsobject);
            }
        });
    } catch (DataAccessException e) {
        throw new DAOException("Error updating verblijfsobject: " + verblijfsobject.getIdentificatie(), e);
    }
}

From source file:nl.ordina.bag.etl.dao.AbstractBAGDAO.java

@Override
public void update(final Ligplaats ligplaats) throws DAOException {
    try {/*from  w ww.j a  va  2 s . com*/
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                jdbcTemplate.update(new PreparedStatementCreator() {
                    @Override
                    public PreparedStatement createPreparedStatement(Connection connection)
                            throws SQLException {
                        PreparedStatement ps = connection.prepareStatement(
                                "update bag_ligplaats set" + " aanduiding_record_inactief = ?,"
                                        + " officieel = ?," + " ligplaats_status = ?,"
                                        + " ligplaats_geometrie = ?," + " einddatum_tijdvak_geldigheid = ?,"
                                        + " in_onderzoek = ?," + " bron_documentdatum = ?,"
                                        + " bron_documentnummer = ?," + " bag_nummeraanduiding_id = ?"
                                        + " where bag_ligplaats_id = ?" + " and aanduiding_record_correctie = ?"
                                        + " and begindatum_tijdvak_geldigheid = ?");
                        ps.setInt(1, ligplaats.getAanduidingRecordInactief().ordinal());
                        ps.setInt(2, ligplaats.getOfficieel().ordinal());
                        ps.setInt(3, ligplaats.getLigplaatsStatus().ordinal());
                        ps.setString(4, ligplaats.getLigplaatsGeometrie());
                        if (ligplaats.getEinddatumTijdvakGeldigheid() == null)
                            ps.setNull(5, Types.TIMESTAMP);
                        else
                            ps.setTimestamp(5,
                                    new Timestamp(ligplaats.getEinddatumTijdvakGeldigheid().getTime()));
                        ps.setInt(6, ligplaats.getInOnderzoek().ordinal());
                        ps.setDate(7, new Date(ligplaats.getDocumentdatum().getTime()));
                        ps.setString(8, ligplaats.getDocumentnummer());
                        ps.setLong(9, ligplaats.getHoofdAdres());
                        ps.setLong(10, ligplaats.getIdentificatie());
                        ps.setLong(11, ligplaats.getAanduidingRecordCorrectie());
                        ps.setTimestamp(12,
                                new Timestamp(ligplaats.getBegindatumTijdvakGeldigheid().getTime()));
                        return ps;
                    }
                });
                deleteNevenadressen(TypeAdresseerbaarObject.LIGPLAATS, ligplaats);
                insertNevenadressen(TypeAdresseerbaarObject.LIGPLAATS, ligplaats);
            }
        });
    } catch (DataAccessException e) {
        throw new DAOException("Error updating ligplaats: " + ligplaats.getIdentificatie(), e);
    }
}

From source file:nl.ordina.bag.etl.dao.AbstractBAGDAO.java

@Override
public void update(final Standplaats standplaats) throws DAOException {
    try {//from  w w w.ja  v  a 2 s  .co m
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                jdbcTemplate.update(new PreparedStatementCreator() {
                    @Override
                    public PreparedStatement createPreparedStatement(Connection connection)
                            throws SQLException {
                        PreparedStatement ps = connection.prepareStatement("update bag_standplaats set"
                                + " aanduiding_record_inactief = ?," + " officieel = ?,"
                                + " standplaats_status = ?," + " standplaats_geometrie = ?,"
                                + " einddatum_tijdvak_geldigheid = ?," + " in_onderzoek = ?,"
                                + " bron_documentdatum = ?," + " bron_documentnummer = ?,"
                                + " bag_nummeraanduiding_id = ?" + " where bag_standplaats_id = ?"
                                + " and aanduiding_record_correctie = ?"
                                + " and begindatum_tijdvak_geldigheid = ?");
                        ps.setInt(1, standplaats.getAanduidingRecordInactief().ordinal());
                        ps.setInt(2, standplaats.getOfficieel().ordinal());
                        ps.setInt(3, standplaats.getStandplaatsStatus().ordinal());
                        ps.setString(4, standplaats.getStandplaatsGeometrie());
                        if (standplaats.getEinddatumTijdvakGeldigheid() == null)
                            ps.setNull(5, Types.TIMESTAMP);
                        else
                            ps.setTimestamp(5,
                                    new Timestamp(standplaats.getEinddatumTijdvakGeldigheid().getTime()));
                        ps.setInt(6, standplaats.getInOnderzoek().ordinal());
                        ps.setDate(7, new Date(standplaats.getDocumentdatum().getTime()));
                        ps.setString(8, standplaats.getDocumentnummer());
                        ps.setLong(9, standplaats.getHoofdAdres());
                        ps.setLong(10, standplaats.getIdentificatie());
                        ps.setLong(11, standplaats.getAanduidingRecordCorrectie());
                        ps.setTimestamp(12,
                                new Timestamp(standplaats.getBegindatumTijdvakGeldigheid().getTime()));
                        return ps;
                    }
                });
                deleteNevenadressen(TypeAdresseerbaarObject.STANDPLAATS, standplaats);
                insertNevenadressen(TypeAdresseerbaarObject.STANDPLAATS, standplaats);
            }
        });
    } catch (DataAccessException e) {
        throw new DAOException("Error updating standplaats: " + standplaats.getIdentificatie(), e);
    }
}

From source file:nl.ordina.bag.etl.dao.AbstractBAGDAO.java

@Override
public void update(final Verblijfsobject origineel, final Verblijfsobject mutation) throws DAOException {
    try {//from  w  ww . j  av a2  s .co m
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                jdbcTemplate.update(new PreparedStatementCreator() {
                    @Override
                    public PreparedStatement createPreparedStatement(Connection connection)
                            throws SQLException {
                        PreparedStatement ps = connection.prepareStatement("update bag_verblijfsobject set"
                                + " aanduiding_record_inactief = ?," + " aanduiding_record_correctie = ?,"
                                + " officieel = ?," + " verblijfsobject_geometrie = ?,"
                                + " oppervlakte_verblijfsobject = ?," + " verblijfsobject_status = ?,"
                                + " einddatum_tijdvak_geldigheid = ?," + " in_onderzoek = ?,"
                                + " bron_documentdatum = ?," + " bron_documentnummer = ?,"
                                + " bag_nummeraanduiding_id = ?" + " where bag_verblijfsobject_id = ?"
                                + " and aanduiding_record_correctie = ?"
                                + " and begindatum_tijdvak_geldigheid = ?");
                        ps.setInt(1, mutation.getAanduidingRecordInactief().ordinal());
                        ps.setLong(2, mutation.getAanduidingRecordCorrectie());
                        ps.setInt(3, mutation.getOfficieel().ordinal());
                        ps.setString(4, mutation.getVerblijfsobjectGeometrie());
                        ps.setInt(5, mutation.getOppervlakteVerblijfsobject());
                        ps.setInt(6, mutation.getVerblijfsobjectStatus().ordinal());
                        if (mutation.getEinddatumTijdvakGeldigheid() == null)
                            ps.setNull(7, Types.TIMESTAMP);
                        else
                            ps.setTimestamp(7,
                                    new Timestamp(mutation.getEinddatumTijdvakGeldigheid().getTime()));
                        ps.setInt(8, mutation.getInOnderzoek().ordinal());
                        ps.setDate(9, new Date(mutation.getDocumentdatum().getTime()));
                        ps.setString(10, mutation.getDocumentnummer());
                        ps.setLong(11, mutation.getHoofdAdres());
                        ps.setLong(12, origineel.getIdentificatie());
                        ps.setLong(13, origineel.getAanduidingRecordCorrectie());
                        ps.setTimestamp(14,
                                new Timestamp(origineel.getBegindatumTijdvakGeldigheid().getTime()));
                        return ps;
                    }
                });
                deleteGebruikersdoelen(origineel);
                insertGebruikersdoelen(mutation);
                deleteNevenadressen(TypeAdresseerbaarObject.VERBLIJFSOBJECT, origineel);
                insertNevenadressen(TypeAdresseerbaarObject.VERBLIJFSOBJECT, mutation);
                deleteGerelateerdePanden(origineel);
                insertGerelateerdePanden(mutation);
            }
        });
    } catch (DataAccessException e) {
        throw new DAOException("Error updating verblijfsobject: " + origineel.getIdentificatie(), e);
    }
}

From source file:nl.ordina.bag.etl.dao.AbstractBAGDAO.java

@Override
public void update(final Ligplaats origineel, final Ligplaats mutation) throws DAOException {
    try {/*from  ww  w.j a  va  2  s .  c o  m*/
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                jdbcTemplate.update(new PreparedStatementCreator() {
                    @Override
                    public PreparedStatement createPreparedStatement(Connection connection)
                            throws SQLException {
                        PreparedStatement ps = connection.prepareStatement("update bag_ligplaats set"
                                + " aanduiding_record_inactief = ?," + " aanduiding_record_correctie = ?,"
                                + " officieel = ?," + " ligplaats_status = ?," + " ligplaats_geometrie = ?,"
                                + " einddatum_tijdvak_geldigheid = ?," + " in_onderzoek = ?,"
                                + " bron_documentdatum = ?," + " bron_documentnummer = ?,"
                                + " bag_nummeraanduiding_id = ?" + " where bag_ligplaats_id = ?"
                                + " and aanduiding_record_correctie = ?"
                                + " and begindatum_tijdvak_geldigheid = ?");
                        ps.setInt(1, mutation.getAanduidingRecordInactief().ordinal());
                        ps.setLong(2, mutation.getAanduidingRecordCorrectie());
                        ps.setInt(3, mutation.getOfficieel().ordinal());
                        ps.setInt(4, mutation.getLigplaatsStatus().ordinal());
                        ps.setString(5, mutation.getLigplaatsGeometrie());
                        if (mutation.getEinddatumTijdvakGeldigheid() == null)
                            ps.setNull(6, Types.TIMESTAMP);
                        else
                            ps.setTimestamp(6,
                                    new Timestamp(mutation.getEinddatumTijdvakGeldigheid().getTime()));
                        ps.setInt(7, mutation.getInOnderzoek().ordinal());
                        ps.setDate(8, new Date(mutation.getDocumentdatum().getTime()));
                        ps.setString(9, mutation.getDocumentnummer());
                        ps.setLong(10, mutation.getHoofdAdres());
                        ps.setLong(11, origineel.getIdentificatie());
                        ps.setLong(12, origineel.getAanduidingRecordCorrectie());
                        ps.setTimestamp(13,
                                new Timestamp(origineel.getBegindatumTijdvakGeldigheid().getTime()));
                        return ps;
                    }
                });
                deleteNevenadressen(TypeAdresseerbaarObject.LIGPLAATS, origineel);
                insertNevenadressen(TypeAdresseerbaarObject.LIGPLAATS, mutation);
            }
        });
    } catch (DataAccessException e) {
        throw new DAOException("Error updating ligplaats: " + origineel.getIdentificatie(), e);
    }
}

From source file:nl.ordina.bag.etl.dao.AbstractBAGDAO.java

@Override
public void update(final Standplaats origineel, final Standplaats mutation) throws DAOException {
    try {//from w w w.  ja  v a 2 s. co m
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                jdbcTemplate.update(new PreparedStatementCreator() {
                    @Override
                    public PreparedStatement createPreparedStatement(Connection connection)
                            throws SQLException {
                        PreparedStatement ps = connection.prepareStatement("update bag_standplaats set"
                                + " aanduiding_record_inactief = ?," + " aanduiding_record_correctie = ?,"
                                + " officieel = ?," + " standplaats_status = ?," + " standplaats_geometrie = ?,"
                                + " einddatum_tijdvak_geldigheid = ?," + " in_onderzoek = ?,"
                                + " bron_documentdatum = ?," + " bron_documentnummer = ?,"
                                + " bag_nummeraanduiding_id = ?" + " where bag_standplaats_id = ?"
                                + " and aanduiding_record_correctie = ?"
                                + " and begindatum_tijdvak_geldigheid = ?");
                        ps.setInt(1, mutation.getAanduidingRecordInactief().ordinal());
                        ps.setLong(2, mutation.getAanduidingRecordCorrectie());
                        ps.setInt(3, mutation.getOfficieel().ordinal());
                        ps.setInt(4, mutation.getStandplaatsStatus().ordinal());
                        ps.setString(5, mutation.getStandplaatsGeometrie());
                        if (mutation.getEinddatumTijdvakGeldigheid() == null)
                            ps.setNull(6, Types.TIMESTAMP);
                        else
                            ps.setTimestamp(6,
                                    new Timestamp(mutation.getEinddatumTijdvakGeldigheid().getTime()));
                        ps.setInt(7, mutation.getInOnderzoek().ordinal());
                        ps.setDate(8, new Date(mutation.getDocumentdatum().getTime()));
                        ps.setString(9, mutation.getDocumentnummer());
                        ps.setLong(10, mutation.getHoofdAdres());
                        ps.setLong(11, origineel.getIdentificatie());
                        ps.setLong(12, origineel.getAanduidingRecordCorrectie());
                        ps.setTimestamp(13,
                                new Timestamp(origineel.getBegindatumTijdvakGeldigheid().getTime()));
                        return ps;
                    }
                });
                deleteNevenadressen(TypeAdresseerbaarObject.STANDPLAATS, origineel);
                insertNevenadressen(TypeAdresseerbaarObject.STANDPLAATS, mutation);
            }
        });
    } catch (DataAccessException e) {
        throw new DAOException("Error updating standplaats: " + origineel.getIdentificatie(), e);
    }
}

From source file:nl.strohalm.cyclos.services.transactions.PaymentServiceImpl.java

/**
 * Insert a transfer and it's generated fees
 * @param simulation/*from w  w w.j  a va  2 s. c o  m*/
 */
private Transfer insertTransferAndPayFees(final LockHandler lockHandler, Transfer transfer,
        final boolean forced, final boolean simulation, final Set<ChargedFee> chargedFees) {
    final TransferType transferType = transfer.getType();
    final Collection<PaymentCustomFieldValue> customValues = transfer.getCustomValues();

    final Account fromAccount = transfer.getFrom();
    final Account toAccount = transfer.getTo();
    if (fromAccount.equals(toAccount)) {
        throw new ValidationException("payment.error.sameFromAntToInFee");
    }
    if (applicationService.getLockedAccountsOnPayments() == LockedAccountsOnPayments.ALL) {
        lockHandler.lock(fromAccount, toAccount);
    }
    final AccountOwner from = fromAccount.getOwner();
    final AccountOwner to = toAccount.getOwner();

    // Preview fees to determine the deducted amount
    final BigDecimal originalAmount = transfer.getAmount();
    final TransactionFeePreviewDTO preview = transactionFeeService.preview(from, to, transferType,
            transfer.getAmount());
    transfer.setAmount(preview.getFinalAmount());

    final Collection<TransferListener> listeners = getTransferListeners(transfer);

    // validate parent amount
    if (!forced) {
        // Notify any registered listener before validating the amount
        if (!simulation) {
            for (final TransferListener listener : listeners) {
                listener.onBeforeValidateBalance(transfer);
            }
        }

        validateAmount(transfer.getAmount(), fromAccount, toAccount, transfer);
    }
    transfer.setCustomValues(null);

    // apply rates, but NOT on inserting authorized payments
    RatesToSave rates = new RatesToSave();
    if (transfer.getProcessDate() != null) {
        rates = rateService.applyTransfer(transfer);
        transfer.setEmissionDate(rates.getEmissionDate());
        transfer.setExpirationDate(rates.getExpirationDate());
        transfer.setiRate(rates.getiRate());
    }

    // insert transfer
    transfer = transferDao.insert(transfer);

    // now we have the tranfers' id, we can persist rate info:
    rateService.persist(rates);

    final TransactionNumber transactionNumber = settingsService.getLocalSettings().getTransactionNumber();
    if (transactionNumber != null && transactionNumber.isValid()) {
        final String generated = transactionNumber.generate(transfer.getId(), transfer.getDate());
        transferDao.updateTransactionNumber(transfer.getId(), generated);
    }

    transfer.setCustomValues(customValues);
    paymentCustomFieldService.saveValues(transfer);

    if (transfer.getProcessDate() == null) {
        // Reserve the amount if pending authorization
        accountService.reservePending(transfer);
    } else {
        // Make sure no closed balances exist after the payment. This works both for payments in past and to fix eventual future closed balances
        accountService.removeClosedBalancesAfter(transfer.getFrom(), transfer.getProcessDate());
        accountService.removeClosedBalancesAfter(transfer.getTo(), transfer.getProcessDate());
    }

    // Notify any registered listener after inserting the transfer
    if (!simulation) {
        for (TransferListener listener : listeners) {
            listener.onTransferInserted(transfer);
        }
    }

    // Log this transfer if the transaction succeeds
    final Transfer toLog = transfer;
    CurrentTransactionData.addTransactionCommitListener(new TransactionCommitListener() {
        @Override
        public void onTransactionCommit() {
            loggingHandler.logTransfer(toLog);
            // Notify the registered listeners if the transfer is processed
            if (!simulation && toLog.getProcessDate() != null && !listeners.isEmpty()) {
                transactionHelper.runInCurrentThread(new TransactionCallbackWithoutResult() {
                    @Override
                    protected void doInTransactionWithoutResult(final TransactionStatus status) {
                        Transfer fetchedTransfer = fetchService.fetch(toLog, Payment.Relationships.FROM,
                                Payment.Relationships.TO);
                        for (TransferListener listener : listeners) {
                            try {
                                listener.onTransferProcessed(fetchedTransfer);
                            } catch (Exception e) {
                                LOG.warn("Error running TransferListener " + listener, e);
                            }
                        }
                    }
                });
            }
        }
    });

    insertFees(lockHandler, transfer, forced, originalAmount, simulation, chargedFees);
    return transfer;
}

From source file:nl.strohalm.cyclos.http.BaseWebServiceTransactionFilter.java

@Override
protected void execute(final HttpServletRequest request, final HttpServletResponse response,
        final FilterChain chain) throws IOException, ServletException {
    // Run the request in a new transaction
    try {//from  ww w. j ava2s. c o m
        transactionHelper.runInCurrentThread(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(final TransactionStatus status) {
                // When debug is enabled, log the transaction begin and add a listener for transaction end log
                prepareDebugLog();

                // Execute the workflow
                try {
                    onBeforeRunInTransaction(request, response);
                    doRunInTransaction(request, response, chain, status);
                } catch (final Throwable t) {
                    try {
                        onError(request, response, t);
                    } catch (final IOException e) {
                        throw new NestableRuntimeException(e);
                    }
                } finally {
                    try {
                        onTransactionEnd(request, response);
                    } catch (final IOException e) {
                        throw new NestableRuntimeException(e);
                    }
                }
            }
        });
    } catch (final NestableRuntimeException e) {
        final Throwable cause = e.getCause();
        if (cause instanceof IOException) {
            throw (IOException) cause;
        }
        if (cause instanceof ServletException) {
            throw (ServletException) cause;
        }
        throw e;
    } finally {
        // Cleanup the thread locals
        WebServiceContext.cleanup();
        LoggedUser.cleanup();
    }
}