{"record":{"id":"0d7407a959f1063f","repo":"flowable/flowable-engine","slug":"pre-upgrade-expression-can-t-be-empty-or-null","errorCode":null,"errorMessage":"Pre upgrade expression can't be empty or null.","messagePattern":"Pre 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":114,"sourceCode":"\n    public void setPreUpgradeJavaDelegate(String javaDelegateClassName) {\n        if (this.preUpgradeScript == null && this.preUpgradeJavaDelegateExpression == null) {\n            if (StringUtils.isNotEmpty(javaDelegateClassName)) {\n                this.preUpgradeJavaDelegate = javaDelegateClassName;\n            } else {\n                throw new IllegalArgumentException(\"Pre upgrade java delegate can't be empty or null.\");\n            }\n        } else {\n            throw new IllegalArgumentException(\"Pre upgrade java delegate can't be set when another pre-upgrade task was already specified.\");\n        }\n    }\n\n    public void setPreUpgradeJavaDelegateExpression(String expression) {\n        if (this.preUpgradeScript == null && this.preUpgradeJavaDelegate == null) {\n            if (StringUtils.isNotEmpty(expression)) {\n                this.preUpgradeJavaDelegateExpression = expression;\n            } else {\n                throw new IllegalArgumentException(\"Pre upgrade expression can't be empty or null.\");\n            }\n        } else {\n            throw new IllegalArgumentException(\"Pre upgrade expression can't be set when another pre-upgrade task was already specified.\");\n        }\n    }\n\n    public void setPostUpgradeScript(Script script) {\n        if (this.postUpgradeJavaDelegate == null && this.postUpgradeJavaDelegateExpression == null) {\n            if (script != null) {\n                this.postUpgradeScript = script;\n            } else {\n                throw new IllegalArgumentException(\"Post upgrade script can't be null.\");\n            }\n        } else {\n            throw new IllegalArgumentException(\"Post upgrade script can't be set when another post-upgrade task was already specified.\");\n        }\n    }\n","sourceCodeStart":96,"sourceCodeEnd":132,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine/src/main/java/org/flowable/engine/impl/migration/ProcessInstanceMigrationDocumentImpl.java#L96-L132","documentation":"setPreUpgradeJavaDelegateExpression requires a non-empty expression string when no other pre-upgrade task is configured. A null or empty expression leaves no pre-upgrade behavior, so it throws IllegalArgumentException.","triggerScenarios":"Calling setPreUpgradeJavaDelegateExpression(null) or (\"\") on a document with no preUpgradeScript or preUpgradeJavaDelegate set.","commonSituations":"Expression resolved from a missing config property or empty JSON field; building expressions dynamically that end up blank; typo resolving to empty string.","solutions":["Pass a valid expression, e.g. setPreUpgradeJavaDelegateExpression(\"${preUpgradeDelegate}\")","Guard with StringUtils.isNotEmpty before calling","Skip the setter when no pre-upgrade expression is needed"],"exampleFix":"// before\ndocument.setPreUpgradeJavaDelegateExpression(props.getProperty(\"pre.upgrade.expr\")); // may be null\n// after\nString expr = props.getProperty(\"pre.upgrade.expr\");\nif (StringUtils.isNotEmpty(expr)) {\n    document.setPreUpgradeJavaDelegateExpression(expr);\n}","handlingStrategy":"validation","validationCode":"if (expression == null || expression.trim().isEmpty()) {\n    throw new IllegalArgumentException(\"preUpgrade expression required\");\n}","typeGuard":"boolean hasText(String s) { return s != null && !s.trim().isEmpty(); }","tryCatchPattern":"try {\n    document.setPreUpgradeJavaDelegateExpression(expression);\n} catch (IllegalArgumentException e) {\n    log.warn(\"No pre-upgrade expression configured: {}\", e.getMessage());\n}","preventionTips":["Resolve expressions from config with defaults or explicit failure earlier","Validate the expression syntax before setting","Apply hasText guards to all expression inputs"],"tags":["flowable","process-migration","empty-argument","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-18T11:17:12.947Z"}