pentaho/pentaho-kettle · error · KettleException

XsdValidatorMeta.Exception.UnableToSaveStepInfo

Error message

XsdValidatorMeta.Exception.UnableToSaveStepInfo

What it means

Thrown by XsdValidatorMeta.saveRep when persisting the step's settings to the repository fails. Exceptions from rep.saveStepAttribute/saveJobEntryAttribute are wrapped in a KettleException with this message plus the id_step, with the original error as cause. It means the step configuration was not saved.

Solutions

  1. Check the cause exception for the underlying JDBC error.
  2. Verify repository database connectivity and write permissions.
  3. Retry the save after reconnecting; verify the transformation id is current.
  4. Save the transformation as a file (.ktr) as a workaround.
Defensive patterns

Strategy: try-catch

Try / catch

try { repository.save(transMeta, versionComment, monitor, null) } catch (KettleException e) { log.error("Save failed for step " + e.getMessage(), e); }

Prevention

When it happens

Trigger: saveRep is called during transformation save and a rep.saveStepAttribute/saveJobEntryAttribute call throws (DB connection lost, constraint violation, read-only repository, invalid id_step).

Common situations: Repository DB session dropped during save; read-only or full database; concurrent modification of the transformation; saving to a transformation whose id is stale.

Related errors


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

Appendix: source

Thrown at plugins/xml/core/src/main/java/org/pentaho/di/trans/steps/xsdvalidator/XsdValidatorMeta.java:330

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step )
    throws KettleException {
    try {
      rep.saveStepAttribute( id_transformation, id_step, "xdsfilename", xsdFilename );
      rep.saveStepAttribute( id_transformation, id_step, "xmlstream", xmlStream );
      rep.saveStepAttribute( id_transformation, id_step, "resultfieldname", resultFieldname );
      rep.saveStepAttribute( id_transformation, id_step, "xmlsourcefile", xmlSourceFile );
      rep.saveStepAttribute( id_transformation, id_step, "addvalidationmsg", addValidationMessage );
      rep.saveStepAttribute( id_transformation, id_step, "validationmsgfield", validationMessageField );
      rep.saveStepAttribute( id_transformation, id_step, "ifxmlvalid", ifXmlValid );
      rep.saveStepAttribute( id_transformation, id_step, "ifxmlunvalid", ifXmlInvalid );
      rep.saveStepAttribute( id_transformation, id_step, "outputstringfield", outputStringField );
      rep.saveStepAttribute( id_transformation, id_step, "xsddefinedfield", xsdDefinedField );
      rep.saveStepAttribute( id_transformation, id_step, "xsdsource", xsdSource );
      rep.saveJobEntryAttribute( id_transformation, id_step, "allowExternalEntities", allowExternalEntities );

    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString( PKG, "XsdValidatorMeta.Exception.UnableToSaveStepInfo" )
          + id_step, e );
    }
  }

  public void check( List<CheckResultInterface> remarks, TransMeta transMeta, StepMeta stepinfo, RowMetaInterface prev,
      String[] input, String[] output, RowMetaInterface info, VariableSpace space, Repository repository,
      IMetaStore metaStore ) {
    CheckResult cr;

    // Check XML stream field
    if ( Utils.isEmpty( xmlStream ) ) {
      cr =
          new CheckResult( CheckResult.TYPE_RESULT_ERROR, BaseMessages.getString( PKG,
              "XsdValidatorMeta.CheckResult.XMLStreamFieldEmpty" ), stepinfo );
      remarks.add( cr );
    } else {
      cr =
          new CheckResult( CheckResult.TYPE_RESULT_OK, BaseMessages.getString( PKG,

View on GitHub (pinned to f3058517a1)