pentaho/pentaho-kettle · error · KettleException

Unable to load job entry of type 'DTDvalidator' from the…

Error message

Unable to load job entry of type 'DTDvalidator' from the repository for id_jobentry=${id_jobentry}

What it means

JobEntryDTDValidator.loadRep() failed while reading the entry's attributes (xmlfilename, dtdfilename, dtdintern) from a repository by id_jobentry. The underlying KettleException from the repository access layer is wrapped and rethrown with this message.

Solutions

  1. Check repository database connectivity and credentials
  2. Verify the job entry rows exist (r_jobentry / r_jobentry_attribute) for the given id_jobentry
  3. Clear the repository cache (clear repository object cache) and retry
  4. Migrate/upgrade the repository schema to match the PDI version
Defensive patterns

Strategy: try-catch

Validate before calling

// check the entry rows exist before load
// SELECT COUNT(*) FROM r_jobentry_attribute WHERE id_jobentry = ?;
// must return the expected attribute rows

Try / catch

try {
  jobMeta.loadRep( rep, metaStore, jobId, null, null );
} catch ( KettleException e ) {
  if ( e.getMessage().contains( "DTDvalidator" ) && e.getMessage().contains( "id_jobentry" ) ) {
    logError( "Repository rows for DTDvalidator entry are missing/corrupt: " + e.getCause() );
  } else { throw e; }
}

Prevention

When it happens

Trigger: loadRep() calls rep.getJobEntryAttributeString/Boolean for id_jobentry and the repository throws KettleException — DB connectivity issues, missing rows in repository tables, or repository schema mismatch.

Common situations: Repository database down or network problem; job entry rows deleted/corrupted in the repository; loading a repository object created by an incompatible PDI version; stale repository cache.

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/f854a779923f632c. Report an issue: GitHub.

Appendix: source

Thrown at plugins/xml/core/src/main/java/org/pentaho/di/job/entries/dtdvalidator/JobEntryDTDValidator.java:113

      super.loadXML( entrynode, databases, slaveServers );
      xmlfilename = XMLHandler.getTagValue( entrynode, "xmlfilename" );
      dtdfilename = XMLHandler.getTagValue( entrynode, "dtdfilename" );
      dtdintern = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "dtdintern" ) );

    } catch ( KettleXMLException xe ) {
      throw new KettleXMLException( "Unable to load job entry of type 'DTDvalidator' from XML node", xe );
    }
  }

  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
      List<SlaveServer> slaveServers ) throws KettleException {
    try {
      xmlfilename = rep.getJobEntryAttributeString( id_jobentry, "xmlfilename" );
      dtdfilename = rep.getJobEntryAttributeString( id_jobentry, "dtdfilename" );
      dtdintern = rep.getJobEntryAttributeBoolean( id_jobentry, "dtdintern" );

    } catch ( KettleException dbe ) {
      throw new KettleException( "Unable to load job entry of type 'DTDvalidator' from the repository for id_jobentry="
          + id_jobentry, dbe );
    }
  }

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
    try {
      rep.saveJobEntryAttribute( id_job, getObjectId(), "xmlfilename", xmlfilename );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "dtdfilename", dtdfilename );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "dtdintern", dtdintern );
    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException( "Unable to save job entry of type 'DTDvalidator' to the repository for id_job="
          + id_job, dbe );
    }
  }

  public String getRealxmlfilename() {
    return environmentSubstitute( xmlfilename );
  }

View on GitHub (pinned to f3058517a1)