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
- Validate/repair the .ktr XML (open in a text editor, check the REST step node is well-formed)
- Re-create the REST step in Spoon and re-save the transformation
- Open the transformation in the same or newer Pentaho version that wrote it
- 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
- Do not hand-edit .ktr files
- Keep Pentaho client version aligned with files being loaded
- Store transformations in version control with merge validation
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
- AggregateRowsMeta.Exception.UnableToLoadStepInfo
- CubeOutputMeta.Exception.UnableToLoadStepInfo
- DatabaseJoinMeta.Exception.UnableToLoadStepInfo
- DelayMeta.Exception.UnableToReadStepInfo
- DetectLastRowMeta.Exception.UnableToReadStepInfo
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)