pentaho/pentaho-kettle · error · KettleException

SingleThreaderDialog.Exception.NoValidMappingDetailsFound

Error message

SingleThreaderDialog.Exception.NoValidMappingDetailsFound

What it means

Reused message key from SingleThreaderDialog thrown by MetaInjectDialog when resolving a repository transformation by name/path: the parsed transPath yields an empty realDirectory or realTransname, so no valid mapping details (repository directory + transformation name) could be derived. The dialog aborts loading the referenced transformation.

Solutions

  1. Provide the full repository path including directory, e.g. '/home/admin/myTransformation', not just the transformation name
  2. If the transformation is at the repository root, verify how your PDI version expects root paths to be expressed
  3. Re-open the Browse dialog and select the transformation from the repository tree instead of typing the path
  4. Use 'Specify by name and directory' with both fields explicitly filled

Example fix

// before
String transPath = 'myTransformation'; // no directory
// after
String transPath = '/home/admin/myTransformation';
Defensive patterns

Strategy: validation

Validate before calling

// Validate repository path before passing to the dialog logic
String transPath = '/home/admin/myTransformation';
int idx = transPath.lastIndexOf('/');
if (idx <= 0 || idx == transPath.length() - 1) {
  throw new IllegalArgumentException('Path must be /directory/transformation');
}

Type guard

boolean isFullRepoPath(String p) {
  int i = p == null ? -1 : p.lastIndexOf('/');
  return i > 0 && i < p.length() - 1;
}

Try / catch

try {
  // load transformation by repository path in dialog
} catch (KettleException e) {
  if (e.getMessage().contains('NoValidMappingDetailsFound')) {
    log.error('Repository path must include directory and name, e.g. /home/admin/trans', e);
  } else throw e;
}

Prevention

When it happens

Trigger: In the Meta Inject dialog, picking a transformation from the repository by path where the selected path string lacks a '/' separator or is empty, so splitting on the last '/' cannot produce both directory and transformation name.

Common situations: Transformation stored at repository root (no directory part) with code expecting '/dir/name'; blank transformation path field; path copied incorrectly without the directory prefix; repository browser selection producing an unexpected path format.

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


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

Appendix: source

Thrown at plugins/meta-inject/impl/src/main/java/org/pentaho/di/trans/steps/metainject/MetaInjectDialog.java:765

      case REPOSITORY_BY_NAME:
        if ( isEmptyFilename ) {
          return false;
        }
        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:
        if ( referenceObjectId == null ) {
          return false;
        }
        injectTransMeta = repository.loadTransformation( referenceObjectId, null ); // load the last version
        injectTransMeta.clearChanged();
        break;
      default:
        break;

View on GitHub (pinned to f3058517a1)