pentaho/pentaho-kettle · error · IllegalArgumentException

MappingInput.Exception.IllegalArgumentValueRename

MappingInput.Exception.IllegalArgumentValueRename

Error message

Rename values should not be null.

What it means

setConnectorSteps() requires a non-null list of MappingValueRename entries describing how parent fields map into the sub-transformation. A null list throws an IllegalArgumentException, because data.valueRenames is later iterated unconditionally in processRow.

Solutions

  1. Pass an empty list (new ArrayList<>()) instead of null when no renames apply.
  2. Collect MappingValueRename entries from the Mapping step's field-mapping definition before calling setConnectorSteps.
  3. Guard the call site: only invoke after the mapping metadata has been initialized.

Example fix

// before
mappingInput.setConnectorSteps(steps, null, "Mapping input");
// after
mappingInput.setConnectorSteps(steps, Collections.emptyList(), "Mapping input");
Defensive patterns

Strategy: type-guard

Validate before calling

if (valueRenames == null) {
  valueRenames = Collections.emptyList();
}

Type guard

boolean isUsableRenames(List<MappingValueRename> renames) { return renames != null; }

Try / catch

try {
  mappingInput.setConnectorSteps(steps, renames, name);
} catch (IllegalArgumentException e) {
  if (e.getMessage().contains("Rename values should not be null")) {
    // pass Collections.emptyList() when no renames apply
  }
  throw e;
}

Prevention

When it happens

Trigger: Calling setConnectorSteps(sourceSteps, null, mappingStepname), or an upstream code path that builds the rename list lazily and yields null.

Common situations: Programmatic mapping construction where the caller forgets to collect mapping-parameter renames; older API versions where the argument was optional; test code probing null handling.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/9fbd8cf484b302a9. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/mappinginput/MappingInput.java:186

  }

  public boolean init( StepMetaInterface smi, StepDataInterface sdi ) {
    meta = (MappingInputMeta) smi;
    data = (MappingInputData) sdi;

    return super.init( smi, sdi );
  }

  public void setConnectorSteps( StepInterface[] sourceSteps, List<MappingValueRename> valueRenames,
      String mappingStepname ) {

    if ( sourceSteps == null ) {
      throw new IllegalArgumentException( BaseMessages
          .getString( PKG, "MappingInput.Exception.IllegalArgumentSourceStep" ) );
    }

    if ( valueRenames == null ) {
      throw new IllegalArgumentException( BaseMessages
          .getString( PKG, "MappingInput.Exception.IllegalArgumentValueRename" ) );
    }

    if ( sourceSteps.length != 0 ) {
      if ( mappingStepname == null ) {
        throw new IllegalArgumentException( BaseMessages
          .getString( PKG, "MappingInput.Exception.IllegalArgumentStepName" ) );
      }
    }

    for ( StepInterface sourceStep : sourceSteps ) {

      // We don't want to add the mapping-to-mapping rowset
      //
      if ( !sourceStep.isMapping() ) {
        // OK, before we leave, make sure there is a rowset that covers the path to this target step.
        // We need to create a new RowSet and add it to the Input RowSets of the target step
        //

View on GitHub (pinned to f3058517a1)