pentaho/pentaho-kettle · error · KettleException

JobXMLWellFormed.Error.Exception.UnableLoadRep + id_jobentry

Error message

JobXMLWellFormed.Error.Exception.UnableLoadRep + id_jobentry

What it means

JobEntryXMLWellFormed.loadRep() failed while reading the entry's attributes (including indexed source_filefolder/wildcard values) from the repository for the given id_jobentry. The underlying KettleException from the repository is wrapped with the localized 'UnableLoadRep' message.

Solutions

  1. Check repository database connectivity and inspect the wrapped exception
  2. Verify r_jobentry_attribute rows exist for id_jobentry with the expected attribute indices
  3. Re-save the job entry from Spoon to rewrite its attributes consistently
  4. Upgrade/migrate the repository schema to the PDI version in use
Defensive patterns

Strategy: try-catch

Validate before calling

// verify attribute rows for id_jobentry exist with contiguous nr indices
// SELECT nr, COUNT(*) FROM r_jobentry_attribute WHERE id_jobentry = ? GROUP BY nr;

Try / catch

try {
  jobMeta.loadRep( rep, metaStore, jobId, null, null );
} catch ( KettleException e ) {
  if ( e.getMessage().contains( "UnableLoadRep" ) ) {
    logError( "Missing repository attributes for XMLWellFormed entry: " + e.getCause() );
  } else { throw e; }
}

Prevention

When it happens

Trigger: loadRep() loops argnr times calling rep.getJobEntryAttributeString(id_jobentry, a, ...) and the repository throws KettleException — missing attribute rows, DB failure, or schema mismatch.

Common situations: Repository rows for the entry partially deleted; repository database connectivity issue; entry saved by an incompatible PDI version with a different attribute layout; nr/argnr mismatch between saved and expected attribute indices.

Understand the failure class

Background: Database query failed: Internal Server Error 500s wrapping SQL, Prisma, and connection failures — what to check first — this error's family across 16 libraries.

Related errors


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

Appendix: source

Thrown at plugins/xml/core/src/main/java/org/pentaho/di/job/entries/xmlwellformed/JobEntryXMLWellFormed.java:200

      include_subfolders = rep.getJobEntryAttributeBoolean( id_jobentry, "include_subfolders" );

      nr_errors_less_than = rep.getJobEntryAttributeString( id_jobentry, "nr_errors_less_than" );
      success_condition = rep.getJobEntryAttributeString( id_jobentry, "success_condition" );
      resultfilenames = rep.getJobEntryAttributeString( id_jobentry, "resultfilenames" );

      // How many arguments?
      int argnr = rep.countNrJobEntryAttributes( id_jobentry, "source_filefolder" );
      source_filefolder = new String[argnr];
      wildcard = new String[argnr];

      // Read them all...
      for ( int a = 0; a < argnr; a++ ) {
        source_filefolder[a] = rep.getJobEntryAttributeString( id_jobentry, a, "source_filefolder" );
        wildcard[a] = rep.getJobEntryAttributeString( id_jobentry, a, "wildcard" );
      }
    } catch ( KettleException dbe ) {

      throw new KettleException( BaseMessages.getString( PKG, "JobXMLWellFormed.Error.Exception.UnableLoadRep" )
          + id_jobentry, dbe );
    }
  }

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
    try {
      rep.saveJobEntryAttribute( id_job, getObjectId(), "arg_from_previous", arg_from_previous );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "include_subfolders", include_subfolders );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "nr_errors_less_than", nr_errors_less_than );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "success_condition", success_condition );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "resultfilenames", resultfilenames );

      // save the arguments...
      if ( source_filefolder != null ) {
        for ( int i = 0; i < source_filefolder.length; i++ ) {
          rep.saveJobEntryAttribute( id_job, getObjectId(), i, "source_filefolder", source_filefolder[i] );
          rep.saveJobEntryAttribute( id_job, getObjectId(), i, "wildcard", wildcard[i] );
        }

View on GitHub (pinned to f3058517a1)