{"record":{"id":"749228fec70243b1","repo":"flowable/flowable-engine","slug":"language-is-required","errorCode":null,"errorMessage":"language is required","messagePattern":"language is required","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/scripting/JSR223FlowableScriptEngine.java","lineNumber":190,"sourceCode":"            return this;\n        }\n\n        @Override\n        public FlowableScriptEvaluationRequest inputVariableContainer(VariableContainer inputVariableContainer) {\n            this.inputVariableContainer = inputVariableContainer;\n            return this;\n        }\n\n        @Override\n        public FlowableScriptEvaluationRequest storeScriptVariables() {\n            this.storeScriptVariables = true;\n            return this;\n        }\n\n        @Override\n        public ScriptEvaluation evaluate() throws FlowableScriptException {\n            if (StringUtils.isEmpty(language)) {\n                throw new FlowableIllegalArgumentException(\"language is required\");\n            }\n\n            if (StringUtils.isEmpty(script)) {\n                throw new FlowableIllegalArgumentException(\"script is required\");\n            }\n\n            ScriptEngine scriptEngine = getEngineByName(language);\n            Bindings bindings = createBindings();\n            try {\n                Object result = scriptEngine.eval(script, bindings);\n                return new ScriptEvaluationImpl(resolver, result);\n            } catch (ScriptException e) {\n                throw new FlowableScriptException(e.getMessage(), e);\n            }\n        }\n\n        protected Bindings createBindings() {\n            return new ScriptBindings(Collections.singletonList(resolver), scopeContainer, inputVariableContainer, storeScriptVariables);","sourceCodeStart":172,"sourceCodeEnd":208,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/scripting/JSR223FlowableScriptEngine.java#L172-L208","documentation":"FlowableScriptEvaluationRequest.evaluate() re-validates the request before executing: if the language field was never set (null or empty) it throws FlowableIllegalArgumentException('language is required'). This catches requests built without calling language() at all, in contrast to the builder-time check in language().","triggerScenarios":"Building a FlowableScriptEvaluationRequest (e.g. via chained fluent setters skipping language()) and calling evaluate(); or a request deserialized/copied without the language field.","commonSituations":"Programmatic script evaluation where the fluent call chain was assembled conditionally and the language branch was skipped; reflection/copy of request objects losing the field.","solutions":["Always call language(<engineName>) before evaluate() on the request builder.","If language comes from external config, resolve it before constructing the request and fail early.","Add an assertion/test that the builder chain includes language()."],"exampleFix":"// before\nFlowableScriptEvaluationRequest req = new FlowableScriptEvaluationRequest().script(\"return 1;\");\nreq.evaluate();\n\n// after\nFlowableScriptEvaluationRequest req = new FlowableScriptEvaluationRequest()\n    .language(\"javascript\")\n    .script(\"return 1;\");\nreq.evaluate();","handlingStrategy":"validation","validationCode":"if (language == null || language.trim().isEmpty()) {\n    throw new IllegalStateException(\"Cannot evaluate script: language was never set on the request\");\n}","typeGuard":"boolean isEvaluableRequest(FlowableScriptEvaluationRequest r) { return r != null && r.getLanguage() != null && !r.getLanguage().isEmpty(); }","tryCatchPattern":"try {\n    return request.evaluate();\n} catch (FlowableIllegalArgumentException e) {\n    throw new IllegalStateException(\"Script request incomplete: \" + e.getMessage(), e);\n}","preventionTips":["Build requests in a single fluent chain so setters cannot be skipped.","Wrap builder construction in a factory method that enforces both language and script.","Add a builder-contract unit test."],"tags":["scripting","validation","builder"],"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-18T11:17:12.947Z"}