pentaho/pentaho-kettle · error · KettleXMLException

Unable to load job entry of type 'Msgbox Info' from XML node

Error message

Unable to load job entry of type 'Msgbox Info' from XML node

What it means

JobEntryMsgBoxInfo.loadXML() wraps any exception raised while reading the job entry's attributes ('bodymessage', 'titremessage') out of a Kettle job XML node into a KettleXMLException with this fixed message. The original cause is attached as the nested exception, so the real problem (malformed XML, wrong node structure, IO issue) is in the 'cause' chain. It indicates the plugin could not deserialize a 'Msgbox Info' job entry from a .kjb file.

Solutions

  1. Open the .kjb file in an XML editor and validate/fix the <entry> node for the Msgbox Info entry (check it has the expected type attribute and well-formed tags).
  2. Inspect the nested 'cause' exception in the stack trace — it names the actual parse/IO failure; fix that root problem first.
  3. Recreate the Msgbox Info job entry in Spoon and re-save the job to regenerate clean XML.
  4. Verify the Kettle/Pentaho version that wrote the file matches or is compatible with the version loading it.

Example fix

// before: hand-edited broken node
<entry><type>MSGBOXINFO</type><bodymessage>hi<titremessage>x</entry>
// after: well-formed node
<entry><type>MSGBOXINFO</type><bodymessage>hi</bodymessage><titremessage>x</titremessage></entry>
Defensive patterns

Strategy: try-catch

Validate before calling

// Java: validate the XML node before loadXML
if (entrynode == null) throw new IllegalArgumentException("entrynode is null");
if (!"entry".equals(entrynode.getNodeName())) throw new IllegalArgumentException("Not a job entry node");
DocumentBuilderFactory.newInstance().newDocumentBuilder()
  .parse(new InputSource(new StringReader(XMLHandler.getXMLHeader() /* or file bytes */))); // well-formedness check

Type guard

boolean isValidEntryNode(Node n) {
  return n != null && n.getNodeType() == Node.ELEMENT_NODE && "entry".equals(n.getNodeName());
}

Try / catch

try {
  jobEntry.loadXML(entrynode, databases, slaveServers, rep, metaStore);
} catch (KettleXMLException e) {
  // the real cause is nested
  logError("Msgbox Info entry XML load failed", e);
  Throwable root = e;
  while (root.getCause() != null) root = root.getCause();
  throw new RuntimeException("Root cause: " + root.getMessage(), root);
}

Prevention

When it happens

Trigger: Calling loadXML(entrynode, databases, slaveServers, rep, metaStore) on a JobEntryMetaStore-aware entry when the XML node is malformed, super.loadXML() throws, XMLHandler.getTagValue() throws (rare), or the entrynode element does not match the expected job-entry schema.

Common situations: Hand-edited or corrupted .kjb job files; XML saved by a different Pentaho/Kettle version with a changed node structure; truncated file transfers; copy-pasting a job entry XML block with mismatched tags; repository import of foreign XML.

Related errors


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

Appendix: source

Thrown at plugins/msg-box-info/impl/src/main/java/org/pentaho/di/job/entries/msgboxinfo/JobEntryMsgBoxInfo.java:89

  public String getXML() {
    StringBuilder retval = new StringBuilder( 50 );

    retval.append( super.getXML() );
    retval.append( "      " ).append( XMLHandler.addTagValue( "bodymessage", bodymessage ) );
    retval.append( "      " ).append( XMLHandler.addTagValue( "titremessage", titremessage ) );

    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 );
      bodymessage = XMLHandler.getTagValue( entrynode, "bodymessage" );
      titremessage = XMLHandler.getTagValue( entrynode, "titremessage" );
    } catch ( Exception e ) {
      throw new KettleXMLException( "Unable to load job entry of type 'Msgbox Info' from XML node", e );
    }
  }

  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
    List<SlaveServer> slaveServers ) throws KettleException {
    try {
      bodymessage = rep.getJobEntryAttributeString( id_jobentry, "bodymessage" );
      titremessage = rep.getJobEntryAttributeString( id_jobentry, "titremessage" );
    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException(
        "Unable to load job entry of type 'Msgbox Info' from the repository with id_jobentry=" + id_jobentry,
        dbe );
    }
  }

  // Save the attributes of this job entry
  //
  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {

View on GitHub (pinned to f3058517a1)