{"record":{"id":"28bbb62932da6e9f","repo":"pentaho/pentaho-kettle","slug":"property-propname-not-found-for-injection-to-rootclass","errorCode":null,"errorMessage":"Property '<propName>' not found for injection to <rootClass>","messagePattern":"Property '<propName>' not found for injection to <rootClass>","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/core/injection/bean/BeanInjector.java","lineNumber":158,"sourceCode":"          }\n          break;\n        case NONE:\n          break;\n      }\n    }\n    return obj;\n  }\n\n  public boolean hasProperty( Object root, String propName ) {\n    BeanInjectionInfo.Property prop = info.getProperties().get( propName );\n    return prop != null;\n  }\n\n  public void setProperty( Object root, String propName, List<RowMetaAndData> data, String dataN )\n    throws KettleException {\n    BeanInjectionInfo.Property prop = info.getProperties().get( propName );\n    if ( prop == null ) {\n      throw new KettleException( \"Property '\" + propName + \"' not found for injection to \" + root.getClass() );\n    }\n\n    String dataName;\n    String dataValue;\n\n    if ( data != null ) {\n      dataName = dataN;\n      dataValue = null;\n    } else {\n      dataName = null;\n      dataValue = dataN;\n    }\n    if ( prop.pathArraysCount == 0 ) {\n      // no arrays in path\n      try {\n        setProperty( root, prop, 0, data != null ? data.get( 0 ) : null, dataName, dataValue );\n      } catch ( Exception ex ) {\n        throw new KettleException( \"Error inject property '\" + propName + \"' into \" + root.getClass(), ex );","sourceCodeStart":140,"sourceCodeEnd":176,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/core/injection/bean/BeanInjector.java#L140-L176","documentation":"BeanInjector.setProperty throws KettleException when the injection property name given by a metadata-injection caller does not exist on the target plugin class. Unlike getObject/getProperty this is the main path used by the ETL metadata injection engine.","triggerScenarios":"A TransMeta/JobMeta generation step passes a source-field-to-property mapping whose property name is not registered in BeanInjectionInfo for the target step/job-entry class.","commonSituations":"Renamed/removed @Injection properties after a Pentaho upgrade; hard-coded mapping rows in the 'ETL metadata injection' step that no longer match; target step changed to a different plugin.","solutions":["Inspect the target class's supported properties (show its injection metadata) and correct the mapping row name","Pin/rebuild against a Kettle version matching the step plugin's property names","Add @Injection to the field if you control the plugin and need that property injectable"],"exampleFix":"// before\nmapping: \"tablename\" -> targetField\n// after\nmapping: \"TABLE_NAME\" -> targetField // matches @Injection(name=\"TABLE_NAME\")","handlingStrategy":"validation","validationCode":"Map<String, BeanInjectionInfo.Property> props = new BeanInjectionInfo(targetStepClass).getProperties();\nmappingKeys.forEach(k -> { if (!props.containsKey(k)) throw new IllegalArgumentException(\"Unknown property \" + k); });","typeGuard":null,"tryCatchPattern":"try { injector.setProperty(meta, propName, data, dataN); }\ncatch (KettleException e) { throw new KettleException(\"Injection mapping invalid for \" + propName, e); }","preventionTips":["Validate the full metadata-injection mapping before running the ETL job","Pin the Kettle version in build/pom so plugin property names stay stable","Read the target step's documented injection fields instead of guessing names"],"tags":["pentaho-kettle","metadata-injection","etl"],"backgroundTag":"record-not-found","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}