{"record":{"id":"17d206ebc978162f","repo":"flowable/flowable-engine","slug":"post-upgrade-expression-can-t-be-set-when-another","errorCode":null,"errorMessage":"Post upgrade expression can't be set when another post-upgrade task was already specified.","messagePattern":"Post upgrade expression 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":153,"sourceCode":"            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() {\n        return migrateToProcessDefinitionVersion;\n    }\n","sourceCodeStart":135,"sourceCodeEnd":171,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine/src/main/java/org/flowable/engine/impl/migration/ProcessInstanceMigrationDocumentImpl.java#L135-L171","documentation":"The post-upgrade task is exclusive: once a Script or Java delegate class is already set, calling setPostUpgradeJavaDelegateExpression throws IllegalArgumentException so only one post-upgrade mechanism exists on the migration document.","triggerScenarios":"Calling setPostUpgradeJavaDelegateExpression(expression) after setPostUpgradeScript or setPostUpgradeJavaDelegate has already been called on the same migration document.","commonSituations":"Multiple configuration layers each choosing a different post-upgrade mechanism; reusing a partially built migration document across different migrations.","solutions":["Set exactly one of script / delegate / delegate-expression per document.","Check existing values via getters before calling the setter.","Build a fresh migration document for each distinct configuration."],"exampleFix":"// before\ndocument.setPostUpgradeJavaDelegate(\"com.acme.FixDelegate\");\ndocument.setPostUpgradeJavaDelegateExpression(\"${fixBean}\");\n\n// after\ndocument.setPostUpgradeJavaDelegate(\"com.acme.FixDelegate\"); // single task only","handlingStrategy":"validation","validationCode":"if (document.getPostUpgradeScript() != null || document.getPostUpgradeJavaDelegate() != null) { throw new IllegalStateException(\"post-upgrade task already set\"); }","typeGuard":null,"tryCatchPattern":"try {\n    document.setPostUpgradeJavaDelegateExpression(expr);\n} catch (IllegalArgumentException e) {\n    logger.warn(\"Another post-upgrade task already configured\", e);\n}","preventionTips":["Pick one post-upgrade mechanism per migration","Don't merge configs that both define post-upgrade tasks","Check 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"}