{"record":{"id":"4e0dcd7c98794f08","repo":"flowable/flowable-engine","slug":"expression-jobtopicexpression-did-not-evaluate","errorCode":null,"errorMessage":"Expression ${jobTopicExpression} did not evaluate to a valid value (non empty String). Was: ${topicValue}. For ${execution}","messagePattern":"Expression (.+?) did not evaluate to a valid value \\(non empty String\\)\\. Was: (.+?)\\. For (.+?)","errorType":"validation","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine/src/main/java/org/flowable/engine/impl/bpmn/behavior/ExternalWorkerTaskActivityBehavior.java","lineNumber":123,"sourceCode":"            job.setRetries(jobServiceConfiguration.getAsyncExecutorNumberOfRetries());\n\n            // Inherit tenant id (if applicable)\n            if (execution.getTenantId() != null) {\n                job.setTenantId(execution.getTenantId());\n            }\n\n            Expression jobTopicExpression;\n            if (StringUtils.isEmpty(beforeContext.getJobTopicExpression())) {\n                jobTopicExpression = this.jobTopicExpression;\n            } else {\n                jobTopicExpression = processEngineConfiguration.getExpressionManager()\n                        .createExpression(beforeContext.getJobTopicExpression());\n            }\n            Object topicValue = jobTopicExpression.getValue(execution);\n            if (topicValue != null && !topicValue.toString().isEmpty()) {\n                job.setJobHandlerConfiguration(topicValue.toString());\n            } else {\n                throw new FlowableException(\"Expression \" + jobTopicExpression + \" did not evaluate to a valid value (non empty String). Was: \" + topicValue + \". For \" + execution);\n            }\n\n            jobService.insertExternalWorkerJob(job);\n\n            if (interceptor != null) {\n                interceptor.afterCreateExternalWorkerJob(new CreateExternalWorkerJobAfterContext(\n                        (ExternalWorkerServiceTask) currentFlowElement,\n                        job,\n                        execution\n                ));\n            }\n        } else {\n            leave(execution);\n        }\n    }\n\n    @Override\n    public void trigger(DelegateExecution execution, String signalName, Object signalData) {","sourceCodeStart":105,"sourceCodeEnd":141,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine/src/main/java/org/flowable/engine/impl/bpmn/behavior/ExternalWorkerTaskActivityBehavior.java#L105-L141","documentation":"External worker task behavior guard: the expression configured as the job topic evaluated to null or an empty string for the current execution, so no external worker job can be created and the behavior fails.","triggerScenarios":"Thrown at modules/flowable-engine/src/main/java/org/flowable/engine/impl/bpmn/behavior/ExternalWorkerTaskActivityBehavior.java:123 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Fix the jobTopicExpression so it resolves to a non-empty string","Use a static topic value instead of an expression","Ensure variables referenced by the expression are set on the execution before the task"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"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"}