pentaho/pentaho-kettle · error · KettleException
Property ' ' has more than one array in path for injection…
Error message
Property '<propName>' has more than one array in path for injection to <rootClass>
What it means
Thrown when an injection property's path would traverse more than one array (e.g. a field of arrays of objects that themselves contain arrays). The bean-injection engine only supports zero or one array level in a property path, so such properties are rejected.
Solutions
- Flatten the plugin's option structure so injectable properties have at most one array in their path
- Remove @Injection from the deeply nested field and inject via an intermediate supported property
- Restructure injection into multiple sequential inject calls on nested objects
Example fix
// before
class A { @Injection(name="X") List<B> bs; } // path: list-of-lists
// after
expose flat @Injection(name="X") List<String> x on the root step class Defensive patterns
Strategy: validation
Validate before calling
BeanInjectionInfo.Property p = new BeanInjectionInfo(stepClass).getProperties().get(propName);
if (p != null && p.pathArraysCount > 1)
throw new IllegalArgumentException("Property " + propName + " unsupported (multi-array path)"); Try / catch
try { injector.setProperty(root, propName, data, n); }
catch (KettleException e) { log.error("Unsupported nested-array property " + propName); } Prevention
- Design plugin option beans with at most one collection level per property
- Scan all injectable properties for pathArraysCount>1 during plugin build
- Prefer flat property naming (e.g. FIELD_NAME_i) over deep nesting
When it happens
Trigger: Target class has a nested structure like @Injection field List<A> where A contains another injectable List — resolving its path yields pathArraysCount > 1 and setProperty rejects it.
Common situations: Plugin authors annotating deeply nested collection fields; using legacy plugin classes with complex nested options under metadata injection.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- Error inject property
- No setter defined for
- Property not found
- Property ' ' not found for injection to
- Binding type + soapBindingElem + encountered. The Web…
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/3c7d352d054c53cd.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/core/injection/bean/BeanInjector.java:201
setProperty( root, prop, i, data.get( i ), dataName, dataValue );
}
} else {
allocateCollectionField( root, info, propName );
for ( int i = 0;; i++ ) {
// NOTE: case when constant value is provided and need to fill out all entries with the same value
// assumption is the field array/list size allocated to correct size
boolean found = setProperty( root, prop, i, null, null, dataValue );
if ( !found ) {
break;
}
}
}
} catch ( Exception ex ) {
throw new KettleException( "Error inject property '" + propName + "' into " + root.getClass(), ex );
}
} else {
if ( prop.pathArraysCount > 1 ) {
throw new KettleException( "Property '" + propName + "' has more than one array in path for injection to "
+ root.getClass() );
}
}
}
/**
* Sets data from RowMetaAndData, or constant value from dataValue depends on 'data != null'.
*/
private boolean setProperty( Object root, BeanInjectionInfo.Property prop, int index, RowMetaAndData data,
String dataName, String dataValue ) throws Exception {
Object obj = root;
for ( int i = 1; i < prop.path.size(); i++ ) {
BeanLevelInfo s = prop.path.get( i );
if ( i < prop.path.size() - 1 ) { // NOTE: if prop.path.size() > 2, then @InjectionDeep field
// get path
Object next;
switch ( s.dim ) {
case ARRAY:View on GitHub (pinned to f3058517a1)