pentaho/pentaho-kettle · error · KettleException

LDAPInput.Error.DynamicFilterFieldMissing

LDAPInput.Error.DynamicFilterFieldMissing

Error message

LDAPInput.Error.DynamicFilterFieldMissing

What it means

LDAPInput.dynamicSearch() throws this when 'Use dynamic filter' is enabled but the 'dynamic filter field' name is empty. The per-row LDAP filter value must come from a named input field. This is a first-row configuration validation check, mirroring the dynamic search base check.

Solutions

  1. Select the field that holds the filter value in the 'Dynamic filter field' dropdown of the LDAP Input step.
  2. Verify the upstream step emits that field and that it is a String.
  3. Uncheck 'Use dynamic filter' if per-row filters are not needed.

Example fix

// before
<use_dynamic_filter>Y</use_dynamic_filter>
<dynamic_filter_fieldname/>
// after
<use_dynamic_filter>Y</use_dynamic_filter>
<dynamic_filter_fieldname>myFilterField</dynamic_filter_fieldname>
Defensive patterns

Strategy: validation

Validate before calling

if (meta.isDynamicFilter() && (meta.getDynamicFilterFieldName() == null || meta.getDynamicFilterFieldName().isEmpty())) {
  throw new IllegalStateException("Dynamic filter is enabled but no dynamic filter field is set");
}

Try / catch

try { row = getOneRow(); } catch (KettleException e) { if (e.getMessage().contains("DynamicFilterFieldMissing")) { logError("Select a dynamic filter field in the LDAP Input dialog"); } throw e; }

Prevention

When it happens

Trigger: meta.isDynamicFilter() is true and Utils.isEmpty(meta.getDynamicFilterFieldName()); i.e. the checkbox is on in the step dialog but no filter field was selected.

Common situations: Enabling dynamic filtering in a cloned step after the source field was renamed; a partially configured step saved before choosing the field.

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

Appendix: source

Thrown at plugins/ldap/impl/src/main/java/org/pentaho/di/trans/steps/ldapinput/LDAPInput.java:146

    // Get row from input rowset & set row busy!
    if ( data.readRow == null ) {
      if ( log.isDetailed() ) {
        logDetailed( BaseMessages.getString( PKG, "LDAPInput.Log.FinishedProcessing" ) );
      }
      setOutputDone();
      return false;
    }
    if ( first ) {
      first = false;

      if ( meta.isDynamicSearch() ) {
        if ( Utils.isEmpty( meta.getDynamicSearchFieldName() ) ) {
          throw new KettleException( BaseMessages.getString( PKG, "LDAPInput.Error.DynamicSearchFieldMissing" ) );
        }
      }
      if ( meta.isDynamicFilter() ) {
        if ( Utils.isEmpty( meta.getDynamicFilterFieldName() ) ) {
          throw new KettleException( BaseMessages.getString( PKG, "LDAPInput.Error.DynamicFilterFieldMissing" ) );
        }
      }

      // Create the output row meta-data
      data.nrIncomingFields = getInputRowMeta().size();
      data.outputRowMeta = getInputRowMeta().clone();
      meta.getFields( getTransMeta().getBowl(), data.outputRowMeta, getStepname(), null, null, this, repository,
                      metaStore );

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

      if ( meta.isDynamicSearch() ) {
        data.indexOfSearchBaseField = getInputRowMeta().indexOfValue( meta.getDynamicSearchFieldName() );
        if ( data.indexOfSearchBaseField < 0 ) {
          // The field is unreachable !
          throw new KettleException( BaseMessages.getString( PKG, "LDAPInput.Exception.CouldnotFindField", meta

View on GitHub (pinned to f3058517a1)