{"record":{"id":"ac95f802baefcf9b","repo":"flowable/flowable-engine","slug":"post-upgrade-script-can-t-be-set-when-another-post","errorCode":null,"errorMessage":"Post upgrade script can't be set when another post-upgrade task was already specified.","messagePattern":"Post upgrade script can't be set when another post-upgrade task was already specified\\.","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine/src/main/java/org/flowable/engine/impl/migration/ProcessInstanceMigrationDocumentImpl.java","lineNumber":129,"sourceCode":"            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\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)) {","sourceCodeStart":111,"sourceCodeEnd":147,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine/src/main/java/org/flowable/engine/impl/migration/ProcessInstanceMigrationDocumentImpl.java#L111-L147","documentation":"Only one post-upgrade task may be configured on a ProcessInstanceMigrationDocument: a script, a Java delegate class, or a delegate expression. If one is already set and setPostUpgradeScript is called again, Flowable throws this IllegalArgumentException to prevent ambiguous post-migration behavior.","triggerScenarios":"Calling setPostUpgradeScript(script) after setPostUpgradeJavaDelegate or setPostUpgradeJavaDelegateExpression has already been called on the same migration document.","commonSituations":"Reusing a builder/config object across migrations without clearing it; combining configuration sources (XML/programmatic) that each set a different post-upgrade task type.","solutions":["Set exactly one of setPostUpgradeScript / setPostUpgradeJavaDelegate / setPostUpgradeJavaDelegateExpression per migration document.","Check with getters (getPostUpgradeScript/getPostUpgradeJavaDelegate/getPostUpgradeJavaDelegateExpression) before setting.","Create a fresh ProcessInstanceMigrationDocument instead of reusing a configured one."],"exampleFix":"// before\ndocument.setPostUpgradeJavaDelegate(\"com.acme.FixDelegate\");\ndocument.setPostUpgradeScript(script);\n\n// after\ndocument.setPostUpgradeScript(script); // only one post-upgrade task","handlingStrategy":"validation","validationCode":"if (document.getPostUpgradeJavaDelegate() != null || document.getPostUpgradeJavaDelegateExpression() != null) { throw new IllegalStateException(\"another post-upgrade task already configured\"); }","typeGuard":null,"tryCatchPattern":"try {\n    document.setPostUpgradeScript(script);\n} catch (IllegalArgumentException e) {\n    logger.warn(\"Post-upgrade task already specified; skipping script\", e);\n}","preventionTips":["Choose one post-upgrade mechanism up front","Don't reuse a migration document builder across different configs","Guard with getters before each setter call"],"tags":["java","flowable","conflict","validation"],"backgroundTag":"conflicting-config-options","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"}