{"record":{"id":"2b3f73c00cd7e96e","repo":"flowable/flowable-engine","slug":"programmatic-error-field-added-to-unknown-element","errorCode":null,"errorMessage":"Programmatic error: field added to unknown element '${currentCmmnElement}'","messagePattern":"Programmatic error: field added to unknown element '(.+?)'","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-converter/src/main/java/org/flowable/cmmn/converter/ExtensionElementsXMLConverter.java","lineNumber":284,"sourceCode":"                        readyWithFieldExtension = true;\n                    }\n                }\n            } catch (Exception e) {\n                LOGGER.warn(\"Error parsing field extension child elements\", e);\n            }\n        }\n\n        CmmnElement currentCmmnElement = conversionHelper.getCurrentCmmnElement();\n        if (currentCmmnElement instanceof ServiceTask) {\n            ((ServiceTask) currentCmmnElement).getFieldExtensions().add(extension);\n\n        } else if (currentCmmnElement instanceof DecisionTask) {\n            ((DecisionTask) currentCmmnElement).getFieldExtensions().add(extension);\n        } else if (currentCmmnElement instanceof FlowableListener) {\n            ((FlowableListener) currentCmmnElement).getFieldExtensions().add(extension);\n\n        } else {\n            throw new FlowableException(\"Programmatic error: field added to unknown element '\" + currentCmmnElement + \"'\");\n\n        }\n    }\n\n    protected void readHttpRequestHandler(XMLStreamReader xtr, ConversionHelper conversionHelper) {\n        BaseElement cmmnElement = conversionHelper.getCurrentCmmnElement();\n        if (!(cmmnElement instanceof HttpServiceTask)) {\n            return;\n        }\n\n        FlowableHttpRequestHandler requestHandler = new FlowableHttpRequestHandler();\n        setImplementation(xtr, requestHandler);\n\n        ((HttpServiceTask) cmmnElement).setHttpRequestHandler(requestHandler);\n    }\n\n    protected void readHttpResponseHandler(XMLStreamReader xtr, ConversionHelper conversionHelper) {\n        BaseElement cmmnElement = conversionHelper.getCurrentCmmnElement();","sourceCodeStart":266,"sourceCodeEnd":302,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-converter/src/main/java/org/flowable/cmmn/converter/ExtensionElementsXMLConverter.java#L266-L302","documentation":"Thrown by ExtensionElementsXMLConverter.readFieldExtension when a <field> extension element is parsed successfully but the current CMMN element's type is not one of the types that accept field extensions. The message says 'programmatic error' because the converter normally guarantees a supported element type; hitting it indicates an internal dispatch gap or an unexpected element on the conversion stack.","triggerScenarios":"A <flowable:field> extension placed inside <extensionElements> of a CMMN element type that has no handler branch in readFieldExtension (not a task/listener/decision task etc.). Usually signals a converter bug or an element type added to the stack unexpectedly.","commonSituations":"Custom/patched Flowable versions where a new element type was not added to readFieldExtension; users copying <field> extensions onto unsupported CMMN elements via hand-edited XML.","solutions":["Inspect which element type is printed in the message and move the <field> extension to a supported parent (task, listener, decision task).","Remove the field extension from the unsupported element.","If it is a legitimate element type, patch/upgrade Flowable so readFieldExtension handles that type (likely a converter bug)."],"exampleFix":"<!-- before: field on unsupported element -->\n<caseTask id=\"ct1\">\n  <extensionElements>\n    <flowable:field name=\"x\" stringValue=\"y\"/>\n  </extensionElements>\n</caseTask>\n<!-- after: move field to the listener that needs it -->\n<caseTask id=\"ct1\">\n  <extensionElements>\n    <flowable:taskListener event=\"end\" class=\"com.acme.Listener\">\n      <flowable:field name=\"x\" stringValue=\"y\"/>\n    </flowable:taskListener>\n  </extensionElements>\n</caseTask>","handlingStrategy":"validation","validationCode":"// Only emit <field> extensions inside elements known to accept them\nSet<String> fieldHosts = Set.of(\"humanTask\", \"serviceTask\", \"decisionTask\", \"caseTask\", \"processTask\", \"taskListener\", ...\n// assert extension parent type ∈ fieldHosts before conversion","typeGuard":"boolean supportsFieldExtension(BaseElement el) {\n    return el instanceof CmmnActivity || el instanceof FlowableListener;\n}","tryCatchPattern":"try {\n    cmmnModel = converter.convertToCmmnModel(stream, encoding);\n} catch (FlowableException e) {\n    if (e.getMessage().startsWith(\"Programmatic error: field added to unknown element\")) {\n        // relocate or remove the field extension on the printed element\n    }\n    throw e;\n}","preventionTips":["Place field extensions only on tasks and listeners, never on structural elements (stages, criteria, sentries).","Treat this as a converter bug signal if your XML looks correct — check for patched element types not covered in readFieldExtension.","Keep Flowable upgraded so newly supported element types have handler branches."],"tags":["cmmn","field-extension","converter-bug"],"backgroundTag":"unsupported-operation","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}