pentaho/pentaho-kettle · error · KettleStepException
HTTP.Exception.CouldnotFindField
HTTP.Exception.CouldnotFindField
Error message
HTTP.Exception.CouldnotFindField
What it means
The HTTP step is configured with argument fields whose names must exist in the incoming row. execHttp resolves each configured argument field via rowMeta.indexOfValue; if a field name is not present in the row, it logs 'ErrorFindingField' and throws this KettleStepException.
Solutions
- Fix the field name in the HTTP step's argument field setting to exactly match an upstream column
- Add a Select Values / Field exists check upstream to guarantee the field is produced
- Re-run 'Get fields' in the step dialog after upstream changes
- Check field-name case — Kettle field names are case-sensitive
- Verify the upstream step that produces the field executes before this step
Example fix
// before (step config) argumentField: "user_id" // upstream produces "userId" // after argumentField: "userId"
Defensive patterns
Strategy: validation
Validate before calling
// before executing, verify configured argument fields exist in the row
RowMetaInterface inputRowMeta = ...; // from upstream preview
for ( String argField : httpMeta.getArgumentField() ) {
if ( argField != null && inputRowMeta.indexOfValue( argField ) < 0 ) {
throw new IllegalArgumentException( "Missing HTTP argument field: " + argField );
}
} Try / catch
try {
transformation.execute( arguments );
} catch ( KettleStepException e ) {
if ( e.getMessage().contains( "CouldnotFindField" ) ) {
log.error( "HTTP step argument field missing from input row: {}", e.getMessage() );
} else { throw e; }
} Prevention
- Use 'Get fields' in the HTTP step dialog after any upstream change
- Add a Select Values step to pin/normalize field names early
- Preview upstream rows to confirm field names before running
- Avoid renaming upstream fields without updating consumers
When it happens
Trigger: execHttp is called (first row processed) and meta.getArgumentField()[i] has no matching column in the input row — indexOfValue returns -1.
Common situations: Field renamed or removed by an upstream step; typo in the 'Accept URL from field / argument field' setting; transformation copied between flows with different row layouts; case-sensitive field-name mismatch.
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
- AutoDoc.Exception.FilenameFieldNotFound
- AutoDoc.Exception.FileTypeFieldNotFound
- ColumnExists.Error.TablenameFieldMissing
- ConcatFields.Error.FieldNotFoundInputStream
- ConcatFields.Error.TargetFieldNotFoundOutputStream
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/15639a585166d4e7.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/http/HTTP.java:83
private static Class<?> PKG = HTTPMeta.class; // for i18n purposes, needed by Translator2!! $NON-NLS-1$
private HTTPMeta meta;
private HTTPData data;
public HTTP( StepMeta stepMeta, StepDataInterface stepDataInterface, int copyNr, TransMeta transMeta, Trans trans ) {
super( stepMeta, stepDataInterface, copyNr, transMeta, trans );
}
private Object[] execHttp( RowMetaInterface rowMeta, Object[] row ) throws KettleException {
if ( first ) {
first = false;
data.argnrs = new int[ meta.getArgumentField().length ];
for ( int i = 0; i < meta.getArgumentField().length; i++ ) {
data.argnrs[ i ] = rowMeta.indexOfValue( meta.getArgumentField()[ i ] );
if ( data.argnrs[ i ] < 0 ) {
logError( BaseMessages.getString( PKG, "HTTP.Log.ErrorFindingField" ) + meta.getArgumentField()[ i ] + "]" );
throw new KettleStepException( BaseMessages.getString( PKG, "HTTP.Exception.CouldnotFindField", meta
.getArgumentField()[ i ] ) );
}
}
}
return callHttpService( rowMeta, row );
}
@VisibleForTesting
Object[] callHttpService( RowMetaInterface rowMeta, Object[] rowData ) throws KettleException {
HttpClientManager.HttpClientBuilderFacade clientBuilder = HttpClientManager.getInstance().createBuilder();
if ( data.realConnectionTimeout > -1 ) {
clientBuilder.setConnectionTimeout( data.realConnectionTimeout );
}
if ( data.realSocketTimeout > -1 ) {
clientBuilder.setSocketTimeout( data.realSocketTimeout );
}View on GitHub (pinned to f3058517a1)