pentaho/pentaho-kettle · error · KettleException

RssInput.Exception.ErrorFindingField

RssInput.Exception.ErrorFindingField

Error message

RssInput.Exception.ErrorFindingField

What it means

RssInput.readNextUrl throws this KettleException when the configured URL field name is non-empty but does not exist in the incoming row (inputRowMeta.indexOfValue returns -1). The step cannot read the feed URL from the stream.

Solutions

  1. Verify the URL field name matches an incoming stream field exactly
  2. Use 'Get Fields' in the step dialog to refresh the field list
  3. Add the URL field upstream (e.g. via Select values or a constant)

Example fix

// before
urlFieldname = "url"; // stream has 'Url'
// after
urlFieldname = "Url";
Defensive patterns

Strategy: validation

Validate before calling

if (inputRowMeta.indexOfValue(urlFieldname) < 0) {
  throw new KettleException("URL field not in stream: " + urlFieldname);
}

Try / catch

try { readNextUrl(); } catch (KettleException e) {
  logError("RSS URL field missing from stream: " + e.getMessage());
  setErrors(1);
}

Prevention

When it happens

Trigger: The URL field name in the dialog does not match any field in the input row stream, case-sensitively.

Common situations: Upstream step renamed or removed the URL field; typo in the dialog; different field casing after a Select values step.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


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

Appendix: source

Thrown at plugins/rss/impl/src/main/java/org/pentaho/di/trans/steps/rssinput/RssInput.java:130

        data.totalpreviousfields = data.inputRowMeta.size();

        // Create convert meta-data objects that will contain Date & Number formatters
        data.convertRowMeta = data.outputRowMeta.cloneToType( ValueMetaInterface.TYPE_STRING );

        // Check is URL field is provided
        if ( Utils.isEmpty( meta.getUrlFieldname() ) ) {
          logError( BaseMessages.getString( PKG, "RssInput.Log.UrlFieldNameMissing" ) );
          throw new KettleException( BaseMessages.getString( PKG, "RssInput.Log.UrlFieldNameMissing" ) );
        }

        // cache the position of the field
        if ( data.indexOfUrlField < 0 ) {
          data.indexOfUrlField = data.inputRowMeta.indexOfValue( meta.getUrlFieldname() );
          if ( data.indexOfUrlField < 0 ) {
            // The field is unreachable !
            logError( BaseMessages.getString( PKG, "RssInput.Log.ErrorFindingField" )
              + "[" + meta.getUrlFieldname() + "]" );
            throw new KettleException( BaseMessages.getString( PKG, "RssInput.Exception.ErrorFindingField", meta
              .getUrlFieldname() ) );
          }
        }

      }
      // get URL field value
      data.currenturl = data.inputRowMeta.getString( data.readrow, data.indexOfUrlField );

    } else {
      if ( data.last_url ) {
        return false;
      }
      if ( data.urlnr >= data.urlsize ) { // finished processing!

        if ( log.isDetailed() ) {
          logDetailed( BaseMessages.getString( PKG, "RssInput.Log.FinishedProcessing" ) );
        }
        return false;

View on GitHub (pinned to f3058517a1)