pentaho/pentaho-kettle · error · KettleXMLException

JobEntryConnectedToRepository.Meta.UnableToLoadFromXML

Error message

JobEntryConnectedToRepository.Meta.UnableToLoadFromXML

What it means

JobEntryConnectedToRepository.loadXML wraps any exception while parsing the job entry's XML node (<isspecificrep>, <repname>, <isspecificuser>, <username> tags) into a KettleXMLException whose message is the localized key 'JobEntryConnectedToRepository.Meta.UnableToLoadFromXML'. It means the job entry could not be deserialized from the .kjb XML.

Solutions

  1. Open the .kjb in a text editor and verify the <entry type='CONNECTED_TO_REPOSITORY'> node contains isspecificrep, repname, isspecificuser, username tags
  2. Restore the job file from backup or version control
  3. Recreate the job entry in Spoon and re-save the job
  4. Check the wrapped cause exception in the log for the precise parse error

Example fix

// before (corrupt job XML)
<entry><isspecificrep>Y</isspecificrep></entry> <!-- repname/username tags missing or malformed -->
// after
<entry>
  <isspecificrep>Y</isspecificrep>
  <repname>myRepo</repname>
  <isspecificuser>Y</isspecificuser>
  <username>admin</username>
</entry>
Defensive patterns

Strategy: try-catch

Validate before calling

// validate the .kjb entry node before load
Node entry = XMLHandler.getSubNode( jobNode, "entry" );
for ( String tag : new String[]{ "isspecificrep", "repname", "isspecificuser", "username" } ) {
  if ( XMLHandler.getTagValue( entry, tag ) == null ) {
    throw new ValidationException( "Missing tag: " + tag );
  }
}

Try / catch

try {
  entry.loadXML( node, databases, slaveServers, rep, metaStore );
} catch ( KettleXMLException e ) {
  logError( "Corrupt job entry XML: " + e.getMessage(), e );
  // recreate entry or restore file from backup
}

Prevention

When it happens

Trigger: Calling loadXML (during job file load) on a node with malformed or missing child tags, or when XMLHandler.getTagValue throws on a corrupt/invalid XML document.

Common situations: Hand-edited or truncated .kjb file; job saved by an incompatible plugin/server version with changed tag names; XML encoding corruption during file transfer.

Understand the failure class

Background: "failed to unmarshal" / json.Unmarshal errors: why parsing a response into a Go struct fails and how to fix it — this error's family across 23 libraries.

Related errors


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

Appendix: source

Thrown at plugins/connected-to-repository/impl/src/main/java/org/pentaho/di/job/entries/connectedtorepository/JobEntryConnectedToRepository.java:125

    retval.append( "      " ).append( XMLHandler.addTagValue( "isspecificuser", isspecificuser ) );
    retval.append( "      " ).append( XMLHandler.addTagValue( "username", username ) );

    retval.append( super.getXML() );

    return retval.toString();
  }

  public void loadXML( Node entrynode, List<DatabaseMeta> databases, List<SlaveServer> slaveServers,
    Repository rep, IMetaStore metaStore ) throws KettleXMLException {
    try {
      super.loadXML( entrynode, databases, slaveServers );
      isspecificrep = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "isspecificrep" ) );
      repname = XMLHandler.getTagValue( entrynode, "repname" );
      isspecificuser = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "isspecificuser" ) );
      username = XMLHandler.getTagValue( entrynode, "username" );

    } catch ( Exception e ) {
      throw new KettleXMLException( BaseMessages.getString(
        PKG, "JobEntryConnectedToRepository.Meta.UnableToLoadFromXML" ), e );
    }
  }

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

    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "JobEntryConnectedToRepository.Meta.UnableToLoadFromRep" )
        + id_jobentry, dbe );

    }

View on GitHub (pinned to f3058517a1)