pentaho/pentaho-kettle · error · KettleXMLException

RestMeta.Exception.UnableToReadStepInfo

RestMeta.Exception.UnableToReadStepInfo

Error message

RestMeta.Exception.UnableToReadStepInfo

What it means

RestMeta.loadXML wraps any exception raised while parsing the step's XML definition into a KettleXMLException with this message. It means the REST step's serialized configuration (in a .ktr file) could not be read into step metadata.

Solutions

  1. Validate/repair the .ktr XML (open in a text editor, check the REST step node is well-formed)
  2. Re-create the REST step in Spoon and re-save the transformation
  3. Open the transformation in the same or newer Pentaho version that wrote it
  4. Restore the .ktr from version control history
Defensive patterns

Strategy: try-catch

Validate before calling

// Validate the .ktr XML before loading:
DocumentBuilderFactory.newInstance().newDocumentBuilder()
  .parse(new File("trans.ktr")); // throws if malformed

Try / catch

try {
  transMeta = new TransMeta("trans.ktr", rep);
} catch (KettleXMLException e) {
  logError("Failed to load REST step XML: " + e.getCause());
}

Prevention

When it happens

Trigger: Malformed or unexpected XML in the <step> node (missing tags, wrong structure), or an exception in XMLHandler while loading a transformation containing a REST step.

Common situations: Hand-edited .ktr file corrupted; transformation written by a newer Pentaho version with extra/changed XML tags; truncated file from bad version control merge.

Understand the failure class

Background: JSON parse error: "Unexpected token" / "not valid JSON" / "failed to parse" — what JSON parsers are really complaining about — this error's family across 45 libraries.

Related errors


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

Appendix: source

Thrown at plugins/rest/core/src/main/java/org/pentaho/di/trans/steps/rest/RestMeta.java:620

        headerName[i] = XMLHandler.getTagValue( anode, TAG_NAME );
      }
      for ( int i = 0; i < nrParameters; i++ ) {
        Node anode = XMLHandler.getSubNodeByNr( paramNode, TAG_PARAMETER, i );
        parameterField[i] = XMLHandler.getTagValue( anode, TAG_FIELD );
        parameterName[i] = XMLHandler.getTagValue( anode, TAG_NAME );
      }
      for ( int i = 0; i < nrMatrixParameters; i++ ) {
        Node anode = XMLHandler.getSubNodeByNr( matrixParametersNode, TAG_MATRIX_PARAMETER, i );
        matrixParameterField[i] = XMLHandler.getTagValue( anode, TAG_FIELD );
        matrixParameterName[i] = XMLHandler.getTagValue( anode, TAG_NAME );
      }

      fieldName = XMLHandler.getTagValue( stepnode, TAG_RESULT, TAG_NAME ); // Optional, can be null
      resultCodeFieldName = XMLHandler.getTagValue( stepnode, TAG_RESULT, TAG_CODE ); // Optional, can be null
      responseTimeFieldName = XMLHandler.getTagValue( stepnode, TAG_RESULT, TAG_RESPONSE_TIME ); // Optional, can be null
      responseHeaderFieldName = XMLHandler.getTagValue( stepnode, TAG_RESULT, TAG_RESPONSE_HEADER ); // Optional, can be null
    } catch ( Exception e ) {
      throw new KettleXMLException( BaseMessages.getString( PKG, "RestMeta.Exception.UnableToReadStepInfo" ), e );
    }
  }

  @Override
  public void readRep( Repository rep, IMetaStore metaStore, ObjectId idStep, List<DatabaseMeta> databases ) throws KettleException {
    try {
      applicationType = rep.getStepAttributeString( idStep, TAG_APPLICATION_TYPE );
      method = rep.getStepAttributeString( idStep, TAG_METHOD );
      url = rep.getStepAttributeString( idStep, TAG_URL );
      urlInField = rep.getStepAttributeBoolean( idStep, TAG_URL_IN_FIELD );

      methodFieldName = rep.getStepAttributeString( idStep, TAG_METHOD_FIELD_NAME );
      dynamicMethod = rep.getStepAttributeBoolean( idStep, TAG_DYNAMIC_METHOD );
      urlField = rep.getStepAttributeString( idStep, TAG_URL_FIELD );
      bodyField = rep.getStepAttributeString( idStep, TAG_BODY_FIELD );
      httpLogin = rep.getStepAttributeString( idStep, TAG_HTTP_LOGIN );
      httpPassword =
        Encr.decryptPasswordOptionallyEncrypted( rep.getStepAttributeString( idStep, TAG_HTTP_PASSWORD ) );

View on GitHub (pinned to f3058517a1)