pentaho/pentaho-kettle · error · KettleStepException

SalesforceUpdate.log.Exception

Error message

SalesforceUpdate.log.Exception

What it means

SalesforceUpdate.processRow() calls writeToSalesForce(outputRowData) inside a try/catch and rethrows any exception as a KettleStepException with the localized message key 'SalesforceUpdate.log.Exception'. It is the outer wrapper: whatever failed inside the Salesforce write (connection, batch flush, API error) surfaces here wrapped as a step exception that stops the transformation.

Solutions

  1. Look at the chained cause — the actionable error is almost always inside writeToSalesForce/flushBuffers.
  2. Verify Salesforce connectivity and credentials (endpoint, username/password/token).
  3. Enable error handling on the step if you want rows routed to an error stream instead of aborting the transformation.
  4. Fix the root cause indicated by the inner exception (e.g. field errors from 3747/3748).
Defensive patterns

Strategy: try-catch

Try / catch

try {
  trans.execute(null);
  trans.waitUntilFinished();
} catch (KettleStepException e) {
  log.error("Salesforce write failed: {}", e.getCause() != null ? e.getCause().toString() : e.getMessage(), e);
  // inspect the chained cause to find the real failure (connection, flush, API error)
}

Prevention

When it happens

Trigger: Any exception escaping writeToSalesForce during normal row processing: Salesforce connection failures, batch flush errors (see flushBuffers), or NPEs inside the write logic.

Common situations: Expired/invalid Salesforce credentials mid-run; network outage during the update batch; an earlier KettleException raised in flushBuffers propagating through this wrapper.

Understand the failure class

Background: "API request failed": what wrapped HTTP errors from external APIs mean and how to find the real cause — this error's family across 29 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/bb02ec6eb780f65a. Report an issue: GitHub.

Appendix: source

Thrown at plugins/salesforce/core/src/main/java/org/pentaho/di/trans/steps/salesforceupdate/SalesforceUpdate.java:104

      meta.getFields( getTransMeta().getBowl(), data.outputRowMeta, getStepname(), null, null, this, repository,
                      metaStore );

      // Build the mapping of input position to field name
      data.fieldnrs = new int[meta.getUpdateStream().length];
      for ( int i = 0; i < meta.getUpdateStream().length; i++ ) {
        data.fieldnrs[i] = getInputRowMeta().indexOfValue( meta.getUpdateStream()[i] );
        if ( data.fieldnrs[i] < 0 ) {
          throw new KettleException( "Field [" + meta.getUpdateStream()[i]
              + "] couldn't be found in the input stream!" );
        }
      }
    }

    try {
      writeToSalesForce( outputRowData );

    } catch ( Exception e ) {
      throw new KettleStepException( BaseMessages.getString( PKG, "SalesforceUpdate.log.Exception" ), e );
    }
    return true;
  }

  @VisibleForTesting
    void writeToSalesForce( Object[] rowData ) throws KettleException {
    try {

      if ( log.isDetailed() ) {
        logDetailed( "Called writeToSalesForce with " + data.iBufferPos + " out of " + meta.getBatchSizeInt() );
      }

      // if there is room in the buffer
      if ( data.iBufferPos < meta.getBatchSizeInt() ) {
        // Reserve for empty fields
        ArrayList<String> fieldsToNull = new ArrayList<String>();
        ArrayList<XmlObject> updatefields = new ArrayList<>();

View on GitHub (pinned to f3058517a1)