{"record":{"id":"94eeaf2b221b6503","repo":"flowable/flowable-engine","slug":"post-upgrade-expression-can-t-be-empty-or-null","errorCode":null,"errorMessage":"Post upgrade expression can't be empty or null.","messagePattern":"Post upgrade expression can't be empty or null\\.","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine/src/main/java/org/flowable/engine/impl/migration/ProcessInstanceMigrationDocumentImpl.java","lineNumber":150,"sourceCode":"\n    public void setPostUpgradeJavaDelegate(String javaDelegateClassName) {\n        if (this.postUpgradeScript == null && this.postUpgradeJavaDelegateExpression == null) {\n            if (StringUtils.isNotEmpty(javaDelegateClassName)) {\n                this.postUpgradeJavaDelegate = javaDelegateClassName;\n            } else {\n                throw new IllegalArgumentException(\"Post upgrade java delegate can't be empty or null.\");\n            }\n        } else {\n            throw new IllegalArgumentException(\"Post upgrade java delegate can't be set when another post-upgrade task was already specified.\");\n        }\n    }\n\n    public void setPostUpgradeJavaDelegateExpression(String expression) {\n        if (this.postUpgradeScript == null && this.postUpgradeJavaDelegate == null) {\n            if (StringUtils.isNotEmpty(expression)) {\n                this.postUpgradeJavaDelegateExpression = expression;\n            } else {\n                throw new IllegalArgumentException(\"Post upgrade expression can't be empty or null.\");\n            }\n        } else {\n            throw new IllegalArgumentException(\"Post upgrade expression can't be set when another post-upgrade task was already specified.\");\n        }\n    }\n\n    @Override\n    public String getMigrateToProcessDefinitionId() {\n        return migrateToProcessDefinitionId;\n    }\n\n    @Override\n    public String getMigrateToProcessDefinitionKey() {\n        return migrateToProcessDefinitionKey;\n    }\n\n    @Override\n    public Integer getMigrateToProcessDefinitionVersion() {","sourceCodeStart":132,"sourceCodeEnd":168,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine/src/main/java/org/flowable/engine/impl/migration/ProcessInstanceMigrationDocumentImpl.java#L132-L168","documentation":"setPostUpgradeJavaDelegateExpression requires a non-empty expression string (e.g. \"${myDelegateBean}\"). Flowable throws IllegalArgumentException when it is null or blank, enforcing that an expression-based post-upgrade task is actually specified.","triggerScenarios":"Calling setPostUpgradeJavaDelegateExpression(null) or an empty/whitespace string while no postUpgradeScript or postUpgradeJavaDelegate has been set yet.","commonSituations":"Expression values resolved from missing Spring bean properties or empty environment entries; generated migration configs with unfilled expression placeholders.","solutions":["Pass a valid expression such as \"${postUpgradeDelegateBean}\".","Omit the call if no post-upgrade task is required.","Use setPostUpgradeScript or setPostUpgradeJavaDelegate for the other task types."],"exampleFix":"// before\nString expr = System.getProperty(\"postUpgradeExpression\"); // null\ndocument.setPostUpgradeJavaDelegateExpression(expr);\n\n// after\nString expr = System.getProperty(\"postUpgradeExpression\");\nif (expr != null && !expr.isBlank()) {\n    document.setPostUpgradeJavaDelegateExpression(expr);\n}","handlingStrategy":"validation","validationCode":"if (expression == null || expression.isBlank()) { throw new IllegalArgumentException(\"expression required\"); }","typeGuard":"boolean isValidExpression(String s) { return s != null && !s.trim().isEmpty(); }","tryCatchPattern":"try {\n    document.setPostUpgradeJavaDelegateExpression(expr);\n} catch (IllegalArgumentException e) {\n    logger.error(\"Post-upgrade expression missing\", e);\n}","preventionTips":["Verify the expression property exists before use","Fail fast when expression config is blank","Set only one post-upgrade task kind per document"],"tags":["java","flowable","validation","expression"],"backgroundTag":"empty-required-field","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}