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

  1. Filter out or default rows with empty URLs before this step (Filter rows on 'url IS NOT NULL AND url <> ""').
  2. Enable the step's error handling to route empty-URL rows to a separate stream instead of failing.
  3. Fix the upstream step so URLs are always populated.
  4. 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

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


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)