pentaho/pentaho-kettle · error · KettleException
SingleThreaderDialog.Exception.NoValidMappingDetailsFound
Error message
SingleThreaderDialog.Exception.NoValidMappingDetailsFound
What it means
SingleThreaderDialog.loadTransformation splits a repository transformation path into directory and transformation name. If either part is empty after parsing (path missing a '/' or blank), it throws this KettleException keyed to SingleThreaderDialog.Exception.NoValidMappingDetailsFound, because the Single Threader's sub-transformation reference cannot be resolved.
Solutions
- Enter the full repository path of the sub-transformation (e.g. /public/flows/sub-trans)
- Reopen the Single Threader dialog and reselect the mapping transformation
- Verify the referenced transformation still exists at the saved path
- If using a file, ensure the file radio is selected with a valid filename instead of repository-by-name
Example fix
// before String transPath = "sub-trans"; // no directory -> exception // after String transPath = "/public/flows/sub-trans";
Defensive patterns
Strategy: validation
Validate before calling
// Java: validate sub-transformation path before loading int idx = transPath.lastIndexOf( '/' ); boolean valid = idx > 0 && !transPath.substring( 0, idx ).isEmpty() && !transPath.substring( idx + 1 ).isEmpty();
Type guard
boolean isFullRepoPath = transPath != null && transPath.contains( "/" ) && transPath.lastIndexOf( '/' ) < transPath.length() - 1;
Try / catch
try { loadTransformation( transPath ); } catch ( KettleException e ) { promptUserToReselectSubTransformation(); } Prevention
- Always specify sub-transformations via the repository browser, not typed names
- Re-validate Single Threader references after moving sub-transformations
- Keep sub-transformations in stable directories
When it happens
Trigger: Loading the Single Threader mapping transformation by name from a repository when the stored path string has no '/' separator (index == -1) or is empty, leaving realDirectory/realTransname empty.
Common situations: Single Threader configured with a transformation name only, not a repository path; references broken by copy/paste of transformations between repositories; manually edited transformation XML with an incomplete path.
Understand the failure class
Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.
Related errors
- SimpleMappingDialog.Exception.NoValidMappingDetailsFound
- SingleThreaderDialog.Exception.UnableToFindRepositoryDirecto…
- GetRepositoryNames.Exception.NotConnectedToRepository
- Repository does not support revisions
- SimpleMappingDialog.Exception.UnableToFindRepositoryDirector…
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/2437b7e375c88369.
Report an issue: GitHub.
Appendix: source
Thrown at ui/src/main/java/org/pentaho/di/ui/trans/steps/singlethreader/SingleThreaderDialog.java:544
case REPOSITORY_BY_NAME:
if ( Utils.isEmpty( filename ) ) {
return;
}
if ( filename.endsWith( ".ktr" ) ) {
filename = filename.replace( ".ktr", "" );
wPath.setText( filename );
}
String transPath = transMeta.environmentSubstitute( filename );
String realTransname = transPath;
String realDirectory = "";
int index = transPath.lastIndexOf( "/" );
if ( index != -1 ) {
realTransname = transPath.substring( index + 1 );
realDirectory = transPath.substring( 0, index );
}
if ( Utils.isEmpty( realDirectory ) || Utils.isEmpty( realTransname ) ) {
throw new KettleException(
BaseMessages.getString( PKG, "SingleThreaderDialog.Exception.NoValidMappingDetailsFound" ) );
}
RepositoryDirectoryInterface repdir = repository.findDirectory( realDirectory );
if ( repdir == null ) {
throw new KettleException( BaseMessages.getString(
PKG, "SingleThreaderDialog.Exception.UnableToFindRepositoryDirectory)" ) );
}
loadRepositoryTrans( realTransname, repdir );
break;
case REPOSITORY_BY_REFERENCE:
mappingTransMeta = repository.loadTransformation( referenceObjectId, null ); // load the last version
mappingTransMeta.clearChanged();
break;
default:
break;
}
wInjectStep.setText( getInjectorStep( mappingTransMeta ) );View on GitHub (pinned to f3058517a1)