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
- Set the URL field in the step dialog to the correct Salesforce endpoint (e.g. https://login.salesforce.com/services/Soap/u/XX.0)
- Ensure any variable used (e.g. ${SALESFORCE_URL}) is defined for the transformation/environment
- Use the Test Connection button to validate before running
- 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
- Always fill the URL field or define its environment variable in kettle.properties
- Use Test Connection before scheduling transformations
- Keep endpoint URLs per environment in a variables file
- Re-check step config after copy-pasting between environments
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
- SalesforceInput.UsernameMissing.Error
- SalesforceInsertDialog.FieldsMissing.DialogMessage
- A connection of type PALO is expected
- A server socket allocation always has to accompanied by…
- DimensionLookupMeta.Error.NoTechnicalKeySpecified
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)