pentaho/pentaho-kettle · error · KettleStepException
Could not create ValueMetaInterface
Error message
Could not create ValueMetaInterface: {0} What it means
TransExecutorMeta wraps a sub-transformation and can copy fields from the sub-transformation's execution results into the main stream. When building the output row metadata it calls ValueMetaFactory.createValueMeta for each configured result field; if the value metadata plugin for the requested type cannot be instantiated (KettlePluginException), it rethrows as KettleStepException with this message naming the offending field.
Solutions
- Check the full stack trace's cause (KettlePluginException) to identify the value type/plugin that failed to load
- Upgrade or reinstall Pentaho Kettle/engine so the ValueMeta plugin for the field type is present
- Re-open the TransExecutor step in Spoon, re-select each result field and its type, and re-save the transformation
- If a custom ValueMeta plugin is involved, verify it is on the classpath and registered
Example fix
// before (broken plugin resolution) ValueMetaInterface value = ValueMetaFactory.createValueMeta( fieldName, type, length, precision ); // after: guard with a known-good type before building metadata int safeType = ValueMetaFactory.getIdForValueMeta( "String" ); ValueMetaInterface value = ValueMetaFactory.createValueMeta( fieldName, type > 0 ? type : safeType, length, precision );
Defensive patterns
Strategy: try-catch
Validate before calling
// Java: verify the value type can be instantiated before running the trans
try {
ValueMetaFactory.createValueMeta( fieldName, type, length, precision );
} catch ( KettlePluginException e ) {
throw new IllegalStateException( "Unusable value type " + type + " for field " + fieldName, e );
} Type guard
boolean isKnownValueType(int type) {
try { ValueMetaFactory.createValueMeta( "check", type, -1, -1 ); return true; }
catch ( KettlePluginException e ) { return false; }
} Try / catch
try {
transExecutorMeta.prepareExecutionResultsFields( rowMeta, nextStepMeta, subTransMeta );
} catch ( KettleStepException e ) {
if ( e.getMessage().contains( "ValueMetaInterface" ) ) {
// inspect cause KettlePluginException, fix field type config or install missing plugin
}
throw e;
} Prevention
- Keep Kettle/plugin versions aligned across design and runtime environments
- Re-open and re-save result-field definitions after version upgrades
- Always check the cause chain for the underlying KettlePluginException
When it happens
Trigger: addFieldToRow is called during output-row metadata preparation (via prepareExecutionResultsFields, prepareResultsRowsFields, or recursively via addFieldToRow) with a non-empty fieldName whose type/length/precision combination cannot be resolved to a ValueMetaInterface plugin — e.g. an unknown or unregistered value type.
Common situations: Running a Pentaho/Kettle version where a value meta plugin was renamed or removed; a transformation saved by a newer version references a value type the current installation cannot instantiate; corrupt step configuration in the .ktr producing an invalid type id.
Understand the failure class
Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.
Related errors
- A deadlock was detected between steps
- AggregateRowsMeta.Exception.UnableToLoadStepInfo
- AppendMeta.Exception.UnableToLoadStepInfo
- At this time we don't support the use of multiple cluster…
- Couldn't find field ' ' in row!
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/f5182e8cbd6f7cf7.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/transexecutor/TransExecutorMeta.java:548
addFieldToRow( row, executionLogTextField, ValueMetaInterface.TYPE_STRING );
addFieldToRow( row, executionLogChannelIdField, ValueMetaInterface.TYPE_STRING, 50, 0 );
}
}
protected void addFieldToRow( RowMetaInterface row, String fieldName, int type ) throws KettleStepException {
addFieldToRow( row, fieldName, type, -1, -1 );
}
protected void addFieldToRow( RowMetaInterface row, String fieldName, int type, int length, int precision )
throws KettleStepException {
if ( !Utils.isEmpty( fieldName ) ) {
try {
ValueMetaInterface value = ValueMetaFactory.createValueMeta( fieldName, type, length, precision );
value.setOrigin( getParentStepMeta().getName() );
row.addValueMeta( value );
} catch ( KettlePluginException e ) {
throw new KettleStepException( BaseMessages.getString( PKG, "TransExecutorMeta.ValueMetaInterfaceCreation",
fieldName ), e );
}
}
}
void prepareExecutionResultsFileFields( RowMetaInterface row, StepMeta nextStep ) throws KettleStepException {
if ( nextStep != null && resultFilesTargetStepMeta != null && nextStep.equals( resultFilesTargetStepMeta ) ) {
addFieldToRow( row, resultFilesFileNameField, ValueMetaInterface.TYPE_STRING );
}
}
void prepareResultsRowsFields( RowMetaInterface row ) throws KettleStepException {
for ( int i = 0; i < outputRowsField.length; i++ ) {
addFieldToRow( row, outputRowsField[ i ], outputRowsType[ i ], outputRowsLength[ i ], outputRowsPrecision[ i ] );
}
}
@OverrideView on GitHub (pinned to f3058517a1)