pentaho/pentaho-kettle · error · KettleException
JobTrans.Dialog.Exception.NoValidMappingDetailsFound
Error message
JobTrans.Dialog.Exception.NoValidMappingDetailsFound
What it means
When the JobEntryTrans is configured to reference its transformation by FILENAME, getInfo() reads wPath and calls jet.setFileName(). If that filename is empty, it throws KettleException 'JobTrans.Dialog.Exception.NoValidMappingDetailsFound' because no valid transformation reference details were supplied. It is raised from getInfo, which is invoked by getParameters and ok, so clicking OK with an empty path triggers it.
Solutions
- Enter a valid, non-empty transformation file path (.ktr) in the Path field before pressing OK.
- Switch the specification method to 'By name' (repository) and select the transformation from the repository instead.
- If building the JobEntryTrans in code, call setFileName(path) whenever specificationMethod is FILENAME.
Example fix
// before
jobEntry.setSpecificationMethod( FILENAME );
jobEntry.setFileName( "" );
// after
String path = new File( TRANSFORMATIONS_DIR, "my-trans.ktr" ).getAbsolutePath();
if ( path != null && !path.isEmpty() ) {
jobEntry.setSpecificationMethod( FILENAME );
jobEntry.setFileName( path );
} Defensive patterns
Strategy: validation
Validate before calling
if ( jet.getSpecificationMethod() == FILENAME
&& ( jet.getFileName() == null || jet.getFileName().trim().isEmpty() ) ) {
throw new IllegalArgumentException(
"JobEntryTrans uses FILENAME but no transformation file path is set" );
} Try / catch
try {
dialog.open();
} catch ( KettleException e ) {
if ( e.getMessage().contains( "NoValidMappingDetailsFound" ) ) {
showFieldError( wPath, "A transformation file path is required" );
wPath.setFocus();
} else {
throw e;
}
} Prevention
- Never OK the dialog with an empty Path field when specification method is FILENAME.
- When switching specification methods programmatically, always populate the matching field (fileName or transObjectId).
- Prefer the repository 'by name' specification for jobs stored in a repository to avoid path dependencies.
- Use absolute paths resolved at job-generation time, not user-typed blanks.
When it happens
Trigger: Job entry dialog with specification method FILENAME and the path field (wPath) left blank or containing only whitespace when OK or parameter retrieval is pressed.
Common situations: User cleared the transformation path after switching specification methods; importing jobs where the file-name field was never populated; programmatic job construction that set specificationMethod=FILENAME but forgot setFileName().
Understand the failure class
Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.
Related errors
- JobEntrySimpleEval.Error.UnparsableDate
- JobXMLWellFormed.Error.Exception.UnableLoadXML
- At least one slave server is required to be present in…
- ChangeFileEncoding.Error.TargetFileIsEmpty
- Could not execute specified in a repository since we're not…
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/3e25517bb3a55e4a.
Report an issue: GitHub.
Appendix: source
Thrown at ui/src/main/java/org/pentaho/di/ui/job/entries/trans/JobEntryTransDialog.java:421
jobEntry = null;
dispose();
}
private void getInfo( JobEntryTrans jet ) throws KettleException {
jet.setName( wName.getText() );
jet.setParentJobMeta( jobMeta );
if ( rep != null ) {
specificationMethod = ObjectLocationSpecificationMethod.REPOSITORY_BY_NAME;
} else {
specificationMethod = ObjectLocationSpecificationMethod.FILENAME;
}
jet.setSpecificationMethod( specificationMethod );
switch ( specificationMethod ) {
case FILENAME:
jet.setFileName( wPath.getText() );
if ( jet.getFilename().isEmpty() ) {
throw new KettleException( BaseMessages.getString( PKG,
"JobTrans.Dialog.Exception.NoValidMappingDetailsFound" ) );
}
jet.setDirectory( null );
jet.setTransname( null );
jet.setTransObjectId( null );
break;
case REPOSITORY_BY_NAME:
String transPath = wPath.getText();
String transName = transPath;
String directory = "";
int index = transPath.lastIndexOf( "/" );
if ( index != -1 ) {
transName = transPath.substring( index + 1 );
directory = index == 0 ? "/" : transPath.substring( 0, index );
}
jet.setDirectory( directory );
jet.setTransname( transName );View on GitHub (pinned to f3058517a1)