pentaho/pentaho-kettle · error · KettleException

HTTP.Log.NoField

HTTP.Log.NoField

Error message

HTTP.Log.NoField

What it means

The HTTP step is configured with 'URL in field?' enabled, but the name of the field that holds the URL is empty. processRow detects this before reading rows and throws KettleException 'HTTP.Log.NoField' after logging the same message.

Solutions

  1. Open the HTTP step dialog and fill in the 'URL field name' with the input stream field that contains the URL.
  2. If the URL is static, disable 'URL in field' and set the URL directly.
  3. Re-export/re-save the transformation to repair missing metadata.

Example fix

// before (meta)
meta.setUrlInField( true );
meta.setUrlField( "" ); // left blank
// after
meta.setUrlInField( true );
meta.setUrlField( "url" ); // existing input field containing the URL
Defensive patterns

Strategy: validation

Validate before calling

if ( meta.isUrlInField() && Utils.isEmpty( meta.getUrlField() ) ) {
  throw new IllegalStateException( "URL field name is required when 'URL in field' is enabled" );
}

Prevention

When it happens

Trigger: meta.isUrlInField() is true and Utils.isEmpty(meta.getUrlField()) — i.e., the 'URL field name' input box was left blank in the step configuration.

Common situations: User enabled 'Accept URL in field' but forgot to type the field name; importing a transformation where the field name got lost; renaming/copying steps between transformations without reconfiguring.

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/d16fb361fd56b119. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/http/HTTP.java:302

    meta = (HTTPMeta) smi;
    data = (HTTPData) sdi;

    Object[] r = getRow(); // Get row from input rowset & set row busy!
    if ( r == null ) { // no more input to be expected...
      setOutputDone();
      return false;
    }

    if ( first ) {
      data.outputRowMeta = getInputRowMeta().clone();
      data.inputRowMeta = getInputRowMeta();
      meta.getFields( getTransMeta().getBowl(), data.outputRowMeta, getStepname(), null, null, this, repository,
        metaStore );

      if ( meta.isUrlInField() ) {
        if ( Utils.isEmpty( meta.getUrlField() ) ) {
          logError( BaseMessages.getString( PKG, "HTTP.Log.NoField" ) );
          throw new KettleException( BaseMessages.getString( PKG, "HTTP.Log.NoField" ) );
        }

        // cache the position of the field
        if ( data.indexOfUrlField < 0 ) {
          String realUrlfieldName = environmentSubstitute( meta.getUrlField() );
          data.indexOfUrlField = getInputRowMeta().indexOfValue( realUrlfieldName );
          if ( data.indexOfUrlField < 0 ) {
            // The field is unreachable !
            logError( BaseMessages.getString( PKG, "HTTP.Log.ErrorFindingField", realUrlfieldName ) );
            throw new KettleException( BaseMessages.getString( PKG, "HTTP.Exception.ErrorFindingField",
              realUrlfieldName ) );
          }
        }
      } else {
        data.realUrl = environmentSubstitute( meta.getUrl() );
      }

      // check for headers

View on GitHub (pinned to f3058517a1)