{"record":{"id":"4cc58eec5fa281ad","repo":"pentaho/pentaho-kettle","slug":"mappingdialog-exception-nomappingspecified","errorCode":"MappingDialog.Exception.NoMappingSpecified","errorMessage":"No mapping (sub-transformation) was specified or it was not a valid one.","messagePattern":"No mapping \\(sub-transformation\\) was specified or it was not a valid one\\.","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/mapping/MappingHelper.java","lineNumber":227,"sourceCode":"    }\n  }\n\n  private RowMetaInterface getFieldsFromParentTrans( String inputStepName, TransMeta transMeta, String stepName ) throws KettleException {\n    if ( Utils.isEmpty( inputStepName ) ) {\n      return transMeta.getPrevStepFields( stepName );\n    } else {\n      StepMeta stepMeta = transMeta.findStep( inputStepName );\n      if ( stepMeta == null ) {\n        throw new KettleException( BaseMessages.getString(\n            PKG, \"MappingDialog.Exception.SpecifiedStepWasNotFound\", inputStepName ) );\n      }\n      return transMeta.getStepFields( stepMeta );\n    }\n  }\n\n  private RowMetaInterface getFieldsFromMappingTrans( String inputStepName, TransMeta mappingTransMeta, boolean mappingInput ) throws KettleException {\n    if ( mappingTransMeta == null ) {\n      throw new KettleException( BaseMessages.getString( PKG, \"MappingDialog.Exception.NoMappingSpecified\" ) );\n    }\n\n    if ( Utils.isEmpty( inputStepName ) ) {\n      String[] stepNames = MappingHelper.getMappingSteps( mappingTransMeta, mappingInput );\n      if ( stepNames.length > 1 ) {\n        throw new KettleException( BaseMessages.getString(\n            PKG, \"MappingDialog.Exception.OnlyOneMappingInputStepAllowed\", \"\" + stepNames.length ) );\n      }\n      if ( stepNames.length == 0 ) {\n        throw new KettleException( BaseMessages.getString(\n            PKG, \"MappingDialog.Exception.OneMappingInputStepRequired\", \"\" + stepNames.length ) );\n      }\n      return mappingTransMeta.getStepFields( stepNames[ 0 ] );\n    } else {\n      StepMeta stepMeta = mappingTransMeta.findStep( inputStepName );\n      if ( stepMeta == null ) {\n        throw new KettleException( BaseMessages.getString(\n            PKG, \"MappingDialog.Exception.SpecifiedStepWasNotFound\", inputStepName ) );","sourceCodeStart":209,"sourceCodeEnd":245,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/mapping/MappingHelper.java#L209-L245","documentation":"Thrown by MappingHelper.getFieldsFromMappingTrans when the Mapping step has no valid sub-transformation (mappingTransMeta == null) while resolving field metadata. Pentaho requires a mapping/sub-transformation to be specified before it can determine the step's output fields.","triggerScenarios":"getFieldsFromStep -> getFieldsFromMappingTrans with a null mappingTransMeta, i.e. the Mapping step's transformation file/repository path is unset, or loadMappingMeta failed to produce a TransMeta.","commonSituations":"User saved the Mapping step dialog without choosing a transformation; the referenced transformation file was moved or deleted; repository connection issues prevented loading; relative paths broken after moving the project.","solutions":["Open the Mapping step dialog and specify a valid sub-transformation file or repository object","Verify the transformation path/file exists at the configured location","Check repository connectivity and permissions if the mapping lives in a repository","Re-enter the mapping reference after moving the project so relative paths resolve"],"exampleFix":"// before\nmappingMeta.setFileName(null); // no sub-transformation chosen\n// after\nmappingMeta.setFileName(\"${Internal.Transformation.Filename.Directory}/child.ktr\");","handlingStrategy":"validation","validationCode":"// before getFields\nif (mappingMeta.getDirectory() == null && Utils.isEmpty(mappingMeta.getFileName()) && mappingMeta.getTransName() == null) {\n  throw new IllegalStateException(\"No mapping sub-transformation specified\");\n}","typeGuard":"boolean hasMapping(MappingMeta meta) { return !Utils.isEmpty(meta.getFileName()) || meta.getRepositoryDirectory() != null || !Utils.isEmpty(meta.getTransName()); }","tryCatchPattern":"try {\n  meta.getFields(...);\n} catch (KettleStepException e) {\n  logError(\"No valid mapping specified: \" + e.getMessage());\n  // prompt user to select a sub-transformation\n}","preventionTips":["Always pick the sub-transformation in the Mapping step dialog before saving","Use ${Internal.Transformation.Filename.Directory} for portable paths","Validate the mapping reference in CI by loading the transformation"],"tags":["kettle","mapping","missing-config","sub-transformation"],"backgroundTag":"missing-required-config","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"}