pentaho/pentaho-kettle · error · KettleException

SalesforceInput.TargetURLMissing.Error

SalesforceInput.TargetURLMissing.Error

Error message

SalesforceInput.TargetURLMissing.Error

What it means

The SalesforceConnection constructor validates required connection parameters before connecting. If the target URL (typically the Salesforce SOAP/REST endpoint, e.g. https://login.salesforce.com/services/Soap/u/{version}) is empty or null, it throws a KettleException with key SalesforceInput.TargetURLMissing.Error.

Solutions

  1. Set the URL field in the step dialog to the correct Salesforce endpoint (e.g. https://login.salesforce.com/services/Soap/u/XX.0)
  2. Ensure any variable used (e.g. ${SALESFORCE_URL}) is defined for the transformation/environment
  3. Use the Test Connection button to validate before running
  4. Check production vs dev environment variable configuration

Example fix

// before
url = ${SF_ENDPOINT}   // undefined -> empty
// after
url = https://login.salesforce.com/services/Soap/u/58.0
// or define SF_ENDPOINT in the environment/kettle.properties
Defensive patterns

Strategy: validation

Validate before calling

String url = environmentSubstitute( meta.getTargetURL() );
if ( url == null || url.trim().isEmpty() ) {
  throw new IllegalStateException( "Salesforce target URL is empty; set it or define its variable" );
}

Try / catch

try {
  SalesforceConnection conn = new SalesforceConnection( log, url, username, password );
} catch ( KettleException e ) {
  if ( e.getMessage().contains( "TargetURLMissing" ) ) {
    fixConfigAndRetry();
  } else throw e;
}

Prevention

When it happens

Trigger: Constructing SalesforceConnection with a step meta whose URL was never set, or where an environment variable in the URL field resolved to empty at runtime.

Common situations: Blank 'Target URL' / 'Connection URL' field in the Salesforce step dialog; ${SF_URL} variable not defined in the environment; login URL cleared after copy-pasting step config; test connection run on a server missing the variable.

Understand the failure class

Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.

Related errors


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

Appendix: source

Thrown at plugins/salesforce/core/src/main/java/org/pentaho/di/trans/steps/salesforce/SalesforceConnection.java:128

    this.binding = null;
    this.loginResult = null;
    this.userInfo = null;
    this.sql = null;
    this.serverTimestamp = null;
    this.qr = null;
    this.startDate = null;
    this.endDate = null;
    this.sObjects = null;
    this.recordsFilter = SalesforceConnectionUtils.RECORDS_FILTER_ALL;
    this.fieldsList = null;
    this.queryResultSize = 0;
    this.recordsCount = 0;
    setUsingCompression( false );
    setRollbackAllChangesOnError( false );

    // check target URL
    if ( Utils.isEmpty( getURL() ) ) {
      throw new KettleException( BaseMessages.getString( PKG, "SalesforceInput.TargetURLMissing.Error" ) );
    }

    // check username
    if ( Utils.isEmpty( getUsername() ) ) {
      throw new KettleException( BaseMessages.getString( PKG, "SalesforceInput.UsernameMissing.Error" ) );
    }

    if ( log.isDetailed() ) {
      logInterface.logDetailed( BaseMessages.getString( PKG, "SalesforceInput.Log.NewConnection" ) );
    }
  }

  public boolean isRollbackAllChangesOnError() {
    return this.rollbackAllChangesOnError;
  }

  /**
   *

View on GitHub (pinned to f3058517a1)