{"record":{"id":"998c437112d8cc72","repo":"flowable/flowable-engine","slug":"language-evaluated-to-null-for-tasklistener-of-t","errorCode":null,"errorMessage":"'language' evaluated to null for taskListener of type 'script'","messagePattern":"'language' evaluated to null for taskListener of type 'script'","errorType":"exception","errorClass":"FlowableIllegalStateException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/listener/ScriptTypeTaskListener.java","lineNumber":57,"sourceCode":"\n    protected Expression resultVariable;\n\n    public ScriptTypeTaskListener() {\n    }\n\n    public ScriptTypeTaskListener(Expression language, Expression script) {\n        this.script = script;\n        this.language = language;\n    }\n\n    @Override\n    public void notify(DelegateTask delegateTask) {\n        validateParameters();\n\n        ScriptingEngines scriptingEngines = CommandContextUtil.getCmmnEngineConfiguration().getScriptingEngines();\n        String language = Objects.toString(this.language.getValue(delegateTask), null);\n        if (language == null) {\n            throw new FlowableIllegalStateException(\"'language' evaluated to null for taskListener of type 'script'\");\n        }\n        String script = Objects.toString(this.script.getValue(delegateTask), null);\n        if (script == null) {\n            throw new FlowableIllegalStateException(\"Script content is null or evaluated to null for taskListener of type 'script'\");\n        }\n\n        ScriptEngineRequest.Builder request = ScriptEngineRequest.builder()\n                .script(script)\n                .language(language)\n                .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            }","sourceCodeStart":39,"sourceCodeEnd":75,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/listener/ScriptTypeTaskListener.java#L39-L75","documentation":"ScriptTypeTaskListener executes its script via the ScriptingEngines at runtime. Before doing so it evaluates the configured 'language' expression; if it evaluates to null the engine cannot select a ScriptEngine and throws FlowableIllegalStateException. This means the language attribute/expression on the script task listener did not resolve to a usable value at execution time.","triggerScenarios":"notify(delegateTask) evaluates this.language.getValue(delegateTask) and, after Objects.toString(..., null), gets null — the language was configured as a dynamic expression that resolves to null, or was left effectively unset in the listener definition.","commonSituations":"language set to an expression like ${langVar} where the variable is missing on the delegate task; XML attribute emptied by a template/generator; relying on a default language that is not applied in this code path; case data not populated before the listener fires.","solutions":["Set the language attribute to a concrete value (e.g. 'javascript', 'groovy', 'juel') in the listener definition, or ensure the referenced variable exists on the task scope.","Validate the CMMN XML so the script listener has both language and script attributes before deployment.","If the language must be dynamic, populate the variable in a prior listener/plan item before the script listener executes.","Confirm the scripting engine for the given language is on the classpath so the value is not discarded downstream."],"exampleFix":"// before (CMMN XML)\n<flowable:taskListener event=\"create\" script=\"task.setVariable('x',1)\" />\n// after\n<flowable:taskListener event=\"create\" language=\"javascript\" script=\"task.setVariable('x',1)\" />","handlingStrategy":"validation","validationCode":"String lang = scriptLanguageExpression != null ? String.valueOf(scriptLanguageExpression) : null;\nif (lang == null || lang.isBlank()) throw new IllegalArgumentException(\"Script task listener language must be set\");","typeGuard":"boolean hasLanguage(FlowableListener l) {\n    return l.getScriptInfo() != null && l.getScriptInfo().getLanguage() != null && !l.getScriptInfo().getLanguage().isBlank();\n}","tryCatchPattern":"try {\n    // task create triggers script listener\n} catch (FlowableIllegalStateException e) {\n    if (e.getMessage() != null && e.getMessage().contains(\"'language' evaluated to null\")) {\n        log.error(\"Script listener language unresolved; check variable \" + langVarName);\n        throw new ConfigurationException(\"Set a concrete scripting language on the listener\", e);\n    }\n    throw e;\n}","preventionTips":["Prefer literal language values over dynamic expressions","Ensure variables referenced by the language expression exist on task scope","Validate script listener attributes in the case model at deploy time"],"tags":["flowable","cmmn","script-task-listener","missing-argument","scripting"],"backgroundTag":"missing-required-argument","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"}