pentaho/pentaho-kettle · error · KettleException

HTTPPOST.Log.NoField

Error message

HTTPPOST.Log.NoField

What it means

The HTTPPOST step is configured with 'URL is in a field?' enabled but the 'URL field name' setting is empty. processRow detects this via Utils.isEmpty(meta.getUrlField()) and throws a KettleException with 'HTTPPOST.Log.NoField' after logging the same message.

Solutions

  1. Open the HTTP POST step dialog and set 'URL field name' to the input field that holds the URL.
  2. If the URL is static instead, uncheck 'URL is in a field?' and enter the URL directly.
  3. Re-save the transformation after fixing the field selection.

Example fix

// before (dialog config)
isUrlInField=true; urlField="";
// after
isUrlInField=true; urlField="request_url"; // name of the incoming field with the URL
Defensive patterns

Strategy: validation

Validate before calling

if (meta.isUrlInField() && (meta.getUrlField() == null || meta.getUrlField().trim().isEmpty()))
  throw new KettleException("URL field name required when URL-in-field is enabled");

Prevention

When it happens

Trigger: processRow (first-portion init) executes when meta.isUrlInField() is true and meta.getUrlField() returns an empty/null string; thrown at line 369 before any rows are processed.

Common situations: User checked 'URL field name' option but forgot to select the input field containing the URL; a saved transformation lost the field selection after renaming the field; metadata copied between environments.

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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/httppost/HTTPPOST.java:369

    meta = (HTTPPOSTMeta) smi;
    data = (HTTPPOSTData) 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 ) {
      first = false;
      data.inputRowMeta = getInputRowMeta();
      data.outputRowMeta = getInputRowMeta().clone();
      meta.getFields( getTransMeta().getBowl(), data.outputRowMeta, getStepname(), null, null, this, repository,
        metaStore );

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

        // cache the position of the field
        if ( data.indexOfUrlField < 0 ) {
          String realUrlfieldName = environmentSubstitute( meta.getUrlField() );
          data.indexOfUrlField = data.inputRowMeta.indexOfValue( ( realUrlfieldName ) );
          if ( data.indexOfUrlField < 0 ) {
            // The field is unreachable !
            logError( BaseMessages.getString( PKG, "HTTPPOST.Log.ErrorFindingField", realUrlfieldName ) );
            throw new KettleException( BaseMessages.getString( PKG, "HTTPPOST.Exception.ErrorFindingField",
              realUrlfieldName ) );
          }
        }
      } else {
        data.realUrl = environmentSubstitute( meta.getUrl() );
      }
      // set body parameters
      int nrargs = meta.getArgumentField().length;

View on GitHub (pinned to f3058517a1)