pentaho/pentaho-kettle · error · KettleException
WebServiceAvailable.Error.URLEmpty
Error message
WebServiceAvailable.Error.URLEmpty
What it means
The step reads the URL string from the current row and rejects it when it is null or empty, since checking availability of an empty URL is meaningless. Thrown per-row inside processRow, so one bad row stops the step (unless error handling is configured).
Solutions
- Filter out or default rows with empty URLs before this step (Filter rows on 'url IS NOT NULL AND url <> ""').
- Enable the step's error handling to route empty-URL rows to a separate stream instead of failing.
- Fix the upstream step so URLs are always populated.
- Optionally point the empty mapping to a placeholder URL if a default target exists.
Example fix
// before: feed all rows to WebServiceAvailable // after: add Filter rows first url IS NOT NULL AND url != '' -> WebServiceAvailable
Defensive patterns
Strategy: validation
Validate before calling
int idx = rowMeta.indexOfValue(meta.getURLField());
// per-row before the step:
if (value == null || value.toString().trim().isEmpty()) {
// route to error/bad-records stream instead of the step
} Try / catch
try {
processRow();
} catch (KettleException e) {
if (e.getMessage().contains("URLEmpty")) {
logBasic("Skipping row with empty URL");
return true; // or route via step error handling
}
throw e;
} Prevention
- Filter null/blank URLs upstream with a Filter rows step
- Enable error handling on the step for bad rows
- Fix upstream data sources to always populate URLs
When it happens
Trigger: data.previousRowMeta.getString(r, data.indexOfURL) returns null or "" for the current row and Utils.isEmpty(url) is true.
Common situations: Upstream source has null/blank URL values for some records; a preceding calculator/formula produced empty strings; joined data missing URL column values.
Understand the failure class
Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.
Related errors
- PGPEncryptStream.Error.DataToEncryptEmpty
- ProcessFiles.Error.SourceFileEmpty
- ProcessFiles.Error.TargetFileEmpty
- SyslogMessage.Error.MessageEmpty
- WebServiceAvailable.Error.FilenameFieldMissing
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/e73fac10253ff39c.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/webserviceavailable/WebServiceAvailable.java:96
// cache the position of the field
data.indexOfURL = data.previousRowMeta.indexOfValue( meta.getURLField() );
if ( data.indexOfURL < 0 ) {
// The field is unreachable !
logError( BaseMessages.getString( PKG, "WebServiceAvailable.Exception.CouldnotFindField" )
+ "[" + meta.getURLField() + "]" );
throw new KettleException( BaseMessages.getString(
PKG, "WebServiceAvailable.Exception.CouldnotFindField", meta.getURLField() ) );
}
} // End If first
try {
// get url
String url = data.previousRowMeta.getString( r, data.indexOfURL );
if ( Utils.isEmpty( url ) ) {
throw new KettleException( BaseMessages.getString( PKG, "WebServiceAvailable.Error.URLEmpty" ) );
}
if ( isDetailed() ) {
logDetailed( BaseMessages.getString( PKG, "WebServiceAvailable.Log.CheckingURL", url ) );
}
boolean WebServiceAvailable = false;
InputStream in = null;
try {
URLConnection conn = new URL( url ).openConnection();
conn.setConnectTimeout( data.connectTimeOut );
conn.setReadTimeout( data.readTimeOut );
in = conn.getInputStream();
// Web service is available
WebServiceAvailable = true;
} catch ( Exception e ) {View on GitHub (pinned to f3058517a1)