{"record":{"id":"9bc559312329daf0","repo":"flowable/flowable-engine","slug":"the-field-language-should-be-set-on-the-tasklist","errorCode":null,"errorMessage":"The field 'language' should be set on the TaskListener","messagePattern":"The field 'language' should be set on the TaskListener","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/listener/ScriptTypeTaskListener.java","lineNumber":85,"sourceCode":"                .scopeContainer(delegateTask)\n                .traceEnhancer(trace -> trace.addTraceTag(\"type\", \"taskListener\"));\n        Object result = scriptingEngines.evaluate(request.build()).getResult();\n\n        if (resultVariable != null) {\n            String resultVariable = Objects.toString(this.resultVariable.getValue(delegateTask), null);\n            if (resultVariable != null) {\n                delegateTask.setVariable(resultVariable, result);\n            }\n        }\n    }\n\n    protected void validateParameters() {\n        if (script == null) {\n            throw new IllegalArgumentException(\"The field 'script' should be set on the TaskListener\");\n        }\n\n        if (language == null) {\n            throw new IllegalArgumentException(\"The field 'language' should be set on the TaskListener\");\n        }\n    }\n\n    public void setScript(Expression script) {\n        this.script = script;\n    }\n\n    public void setLanguage(Expression language) {\n        this.language = language;\n    }\n\n    public void setResultVariable(Expression resultVariable) {\n        this.resultVariable = resultVariable;\n    }\n\n    public Expression getResultVariable() {\n        return resultVariable;\n    }","sourceCodeStart":67,"sourceCodeEnd":103,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/listener/ScriptTypeTaskListener.java#L67-L103","documentation":"ScriptTypeTaskListener needs both a script and a scripting language to evaluate it. When notify() runs validateParameters() and the 'language' field is null, this IllegalArgumentException is thrown because the engine cannot select a script engine.","triggerScenarios":"A ScriptTypeTaskListener definition sets the 'script' field but omits the 'language' field (or the language Expression resolves to null) at execution time.","commonSituations":"Misspelled field name in CMMN XML (must be exactly 'language'); using a language name not resolvable by the configured script engine manager so the expression evaluates to null; copy-paste of listener XML that dropped the language field.","solutions":["Add the 'language' field to the listener: <flowable:field name=\"language\" stringValue=\"javascript\"/> (or groovy, juel, etc.)","Verify the scripting language name matches a JSR-223 engine available on the classpath","If setting programmatically, call setLanguage(expression) before execution"],"exampleFix":"// before\n<flowable:taskListener event=\"complete\" class=\"org.flowable.cmmn.engine.impl.listener.ScriptTypeTaskListener\">\n  <flowable:field name=\"script\"><flowable:string><![CDATA[println('hi')]]></flowable:string></flowable:field>\n</flowable:taskListener>\n// after\n<flowable:taskListener event=\"complete\" class=\"org.flowable.cmmn.engine.impl.listener.ScriptTypeTaskListener\">\n  <flowable:field name=\"script\"><flowable:string><![CDATA[println('hi')]]></flowable:string></flowable:field>\n  <flowable:field name=\"language\" stringValue=\"javascript\"/>\n</flowable:taskListener>","handlingStrategy":"validation","validationCode":"if (!fields.language || !fields.language.stringValue) throw new Error('ScriptTypeTaskListener: missing language field');","typeGuard":"function hasLanguage(l) { return l != null && l.language != null && l.language.expressionText != null; }","tryCatchPattern":"try { runListener(listener); } catch (e) { if (String(e.message).includes(\"field 'language' should be set\")) { configureLanguage(listener); } else { throw e; } }","preventionTips":["Verify the language name matches a JSR-223 engine on the classpath (javascript, groovy, juel)","Use model validation before deploying case definitions","Keep listener field names exactly 'script' and 'language'"],"tags":["cmmn","task-listener","scripting","configuration"],"backgroundTag":"missing-required-config-field","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}