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
- Check repository database connectivity and inspect the wrapped exception
- Verify r_jobentry_attribute rows exist for id_jobentry with the expected attribute indices
- Re-save the job entry from Spoon to rewrite its attributes consistently
- 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
- Verify repository integrity after failed or interrupted saves
- Keep PDI versions consistent across save/load environments
- Avoid manual manipulation of r_jobentry_attribute rows
- Re-save entries whose attribute rows look inconsistent
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
- Unable to load job entry of type 'DTDvalidator' from the…
- JobEntryCheckFilesLocked.UnableToLoadFromRepo
- JobEntryCheckFilesLocked.UnableToSaveToRepo
- JobEntryColumnsExist.Meta.UnableLoadRep
- JobEntryColumnsExist.Meta.UnableSaveRep
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)