pentaho/pentaho-kettle · error · KettleException
Field [ ] couldn't be found in the input stream!
Error message
Field [{0}] couldn't be found in the input stream! What it means
Thrown in LDAPOutput.processRows when a field configured in the update stream mapping does not exist in the incoming row metadata — getInputRowMeta().indexOfValue(...) returns -1. The step builds the mapping of input positions to fields and aborts when a configured stream field is absent from the actual input rows.
Solutions
- Fix the field name in the LDAP Output dialog's stream-field column to exactly match an upstream field (case-sensitive)
- Inspect the row structure with 'Get Fields' in the dialog to refresh names from the input step
- Add/repair the upstream step that should produce the missing field
- If the field name uses variables, verify the variable resolves to the actual field name at runtime
Example fix
// before Stream field: FirstName (upstream produces 'firstname') // after Stream field: firstname
Defensive patterns
Strategy: validation
Validate before calling
// Verify configured stream fields exist in the input row metadata before running
RowMetaInterface in = transMeta.getPrevStepFields(stepMeta);
for (String f : ((LDAPOutputMeta) stepMeta.getStepMetaInterface()).getUpdateStream()) {
if (in.indexOfValue(f) < 0) {
throw new IllegalStateException("Field [" + f + "] missing from upstream output");
}
} Try / catch
try {
runTransformation();
} catch (KettleException e) {
if (e.getMessage().contains("couldn't be found in the input stream")) {
String field = e.getMessage().replaceAll(".*Field \\[(.+?)\\].*", "$1");
throw new IllegalStateException("Fix LDAP Output mapping: upstream has no field " + field);
}
throw e;
} Prevention
- Re-run 'Get Fields' after changing upstream steps
- Keep field names exact (case-sensitive)
- Refresh mappings whenever upstream field names change
- Verify variables in field names resolve in the target environment
When it happens
Trigger: A name in meta.getUpdateStream()[i] (after variable substitution) does not match any field of the input row: indexOfValue returns < 0 and the exception is thrown listing the missing field.
Common situations: Upstream step was renamed or removed a field; typo in the field name; field is generated conditionally so some rows lack it (metadata says it never exists); transformation moved between environments where variables resolve differently.
Understand the failure class
Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.
Related errors
- LDAPOutputUpdateDialog.FieldsMissing.DialogMessage
- Could not find field
- KettleTrustManager.Exception.CouldNotInitializeKettleTrustManager
- KettleTrustManager.Exception.CouldNotCreateCertStore
- KettleTrustManager.Exception.CouldNotInitializeTrustManager
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/bf0797242212e02f.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/ldap/impl/src/main/java/org/pentaho/di/trans/steps/ldapoutput/LDAPOutput.java:89
throw new KettleException( BaseMessages.getString(
PKG, "LDAPOutputUpdateDialog.FieldsMissing.DialogMessage" ) );
}
// Take care of variable
data.fieldsAttribute = new String[data.nrfields];
// Build the mapping of input position to field name
data.fieldStream = new int[data.nrfields];
// Fields to update
List<Integer> fieldsToUpdateInStreaml = new ArrayList<Integer>();
List<String> fieldsToUpdateAttributel = new ArrayList<String>();
for ( int i = 0; i < data.nrfields; i++ ) {
data.fieldStream[i] =
getInputRowMeta().indexOfValue( environmentSubstitute( meta.getUpdateStream()[i] ) );
if ( data.fieldStream[i] < 0 ) {
throw new KettleException( "Field ["
+ meta.getUpdateStream()[i] + "] couldn't be found in the input stream!" );
}
data.fieldsAttribute[i] = environmentSubstitute( meta.getUpdateLookup()[i] );
if ( meta.getOperationType() == LDAPOutputMeta.OPERATION_TYPE_UPSERT ) {
if ( meta.getUpdate()[i].booleanValue() ) {
// We need also to keep care of the fields to update
fieldsToUpdateInStreaml.add( data.fieldStream[i] );
fieldsToUpdateAttributel.add( data.fieldsAttribute[i] );
}
}
}
data.nrfieldsToUpdate = fieldsToUpdateInStreaml.size();
if ( data.nrfieldsToUpdate > 0 ) {
data.fieldStreamToUpdate = new int[data.nrfieldsToUpdate];
data.fieldsAttributeToUpdate = new String[data.nrfieldsToUpdate];
for ( int i = 0; i < fieldsToUpdateInStreaml.size(); i++ ) {View on GitHub (pinned to f3058517a1)