{"record":{"id":"223891b1c3b5d3bd","repo":"pentaho/pentaho-kettle","slug":"rssoutput-exception-fieldrequired","errorCode":null,"errorMessage":"RssOutput.Exception.FieldRequired","messagePattern":"RssOutput\\.Exception\\.FieldRequired","errorType":"exception","errorClass":"KettleStepException","httpStatus":null,"severity":"error","filePath":"plugins/rss/impl/src/main/java/org/pentaho/di/trans/steps/rssoutput/RssOutput.java","lineNumber":441,"sourceCode":"        // Item author field ...\n        if ( !Utils.isEmpty( meta.getItemAuthor() ) ) {\n          data.indexOfFielditemauthor = data.inputRowMeta.indexOfValue( meta.getItemAuthor() );\n          if ( data.indexOfFielditemauthor < 0 ) {\n            // The field is unreachable !\n            logError( BaseMessages.getString( PKG, \"RssOutput.Log.ErrorFindingField\", meta.getItemAuthor() ) );\n            throw new KettleException( BaseMessages.getString( PKG, \"RssOutput.Log.ErrorFindingField\", meta\n              .getItemAuthor() ) );\n          }\n        }\n      } else {\n        // Custom RSS\n        // Check Custom channel fields\n        data.customchannels = new int[meta.getChannelCustomFields().length];\n        for ( int i = 0; i < meta.getChannelCustomFields().length; i++ ) {\n          data.customchannels[i] = data.inputRowMeta.indexOfValue( meta.getChannelCustomFields()[i] );\n          if ( data.customchannels[i] < 0 ) { // couldn't find field!\n\n            throw new KettleStepException( BaseMessages.getString( PKG, \"RssOutput.Exception.FieldRequired\", meta\n              .getChannelCustomFields()[i] ) );\n          }\n        }\n        // Check Custom channel fields\n        data.customitems = new int[meta.getItemCustomFields().length];\n        for ( int i = 0; i < meta.getItemCustomFields().length; i++ ) {\n          data.customitems[i] = data.inputRowMeta.indexOfValue( meta.getItemCustomFields()[i] );\n          if ( data.customitems[i] < 0 ) { // couldn't find field!\n\n            throw new KettleStepException( BaseMessages.getString( PKG, \"RssOutput.Exception.FieldRequired\", meta\n              .getItemCustomFields()[i] ) );\n          }\n        }\n        // Prepare Output RSS Custom document\n        data.document = DocumentHelper.createDocument();\n        data.rssElement = data.document.addElement( \"rss\" );\n        data.rssElement.addAttribute( \"version\", \"2.0\" );\n        // add namespaces here ...","sourceCodeStart":423,"sourceCodeEnd":459,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/rss/impl/src/main/java/org/pentaho/di/trans/steps/rssoutput/RssOutput.java#L423-L459","documentation":"In custom RSS mode, the RSS Output step validates every configured custom channel field against the input row metadata. If any custom channel field cannot be found (indexOfValue < 0), it throws KettleStepException with the 'FieldRequired' message naming the missing field, aborting the transformation.","triggerScenarios":"Custom RSS is enabled and one of meta.getChannelCustomFields()[i] does not exist in data.inputRowMeta during processRow setup.","commonSituations":"Custom channel fields list contains stale names after upstream schema changes; user typed field names manually instead of selecting them; transformation reused with a different data source that lacks those columns.","solutions":["Open the RSS Output dialog's custom channel fields table and remove or correct the missing field named in the exception message.","Use 'Get Fields' to repopulate the custom field list from the actual input stream.","Add the missing column upstream (Select Values / rename) so the configured custom field exists.","Re-check after changing the input step, since the custom field list is not auto-synced."],"exampleFix":"// before\nmeta.setChannelCustomFields(new String[] { \"title\", \"channel_extra\" }); // channel_extra missing\n// after\nmeta.setChannelCustomFields(new String[] { \"title\", \"channel_description\" });","handlingStrategy":"validation","validationCode":"// Ensure every configured custom channel field exists before execution\nfor (String f : configuredCustomChannelFields) {\n    if (inputRowMeta.indexOfValue(f) < 0) {\n        throw new IllegalStateException(\"Custom channel field not in stream: \" + f);\n    }\n}","typeGuard":null,"tryCatchPattern":"try {\n    transformation.execute();\n} catch (KettleStepException e) {\n    if (e.getMessage().contains(\"FieldRequired\")) {\n        String missing = extractFieldName(e.getMessage());\n        // remove or remap `missing` in the step config and retry\n    }\n}","preventionTips":["Regenerate the custom field list with 'Get Fields' after any upstream change","Keep custom channel fields in sync with the actual source schema","Avoid hand-editing the ktr XML for custom field lists","Run a dry-run in a dev environment with production-like schema"],"tags":["pentaho-kettle","rss-output","custom-rss","field-not-found"],"backgroundTag":"resource-not-found","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}