{"record":{"id":"ef02569ec0cd835d","repo":"flowable/flowable-engine","slug":"transactionmanager-is-required-property-for-spring","errorCode":null,"errorMessage":"transactionManager is required property for SpringAppEngineConfiguration, use org.flowable.app.engine.AppEngineConfiguration otherwise","messagePattern":"transactionManager is required property for SpringAppEngineConfiguration, use org\\.flowable\\.app\\.engine\\.AppEngineConfiguration otherwise","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-app-engine-spring/src/main/java/org/flowable/app/spring/SpringAppEngineConfiguration.java","lineNumber":98,"sourceCode":"    protected EngineConfigurator createDefaultEventRegistryEngineConfigurator() {\n        return new SpringEventRegistryConfigurator();\n    }\n\n    public void setTransactionSynchronizationAdapterOrder(Integer transactionSynchronizationAdapterOrder) {\n        this.transactionSynchronizationAdapterOrder = transactionSynchronizationAdapterOrder;\n    }\n\n    @Override\n    public void initDefaultCommandConfig() {\n        if (defaultCommandConfig == null) {\n            defaultCommandConfig = new CommandConfig().setContextReusePossible(true);\n        }\n    }\n\n    @Override\n    public CommandInterceptor createTransactionInterceptor() {\n        if (transactionManager == null) {\n            throw new FlowableException(\"transactionManager is required property for SpringAppEngineConfiguration, use \" + AppEngineConfiguration.class.getName() + \" otherwise\");\n        }\n\n        return new SpringTransactionInterceptor(transactionManager);\n    }\n\n    @Override\n    public void initTransactionContextFactory() {\n        if (transactionContextFactory == null && transactionManager != null) {\n            transactionContextFactory = new SpringTransactionContextFactory(transactionManager, transactionSynchronizationAdapterOrder);\n        }\n    }\n\n    protected void autoDeployResources(AppEngine appEngine) {\n        if (deploymentResources != null && deploymentResources.length > 0) {\n            final AutoDeploymentStrategy<AppEngine> strategy = getAutoDeploymentStrategy(deploymentMode);\n            strategy.deployResources(getDeploymentName(), deploymentResources, appEngine);\n        }\n    }","sourceCodeStart":80,"sourceCodeEnd":116,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-app-engine-spring/src/main/java/org/flowable/app/spring/SpringAppEngineConfiguration.java#L80-L116","documentation":"FlowableException thrown by SpringAppEngineConfiguration.createTransactionInterceptor when transactionManager is null. A Spring app engine requires a Spring PlatformTransactionManager to wire its SpringTransactionInterceptor; without it commands cannot run transactionally.","triggerScenarios":"Building a SpringAppEngineConfiguration without setting the transactionManager property, then initializing the engine.","commonSituations":"Forgetting the transactionManager bean/property in Spring XML or Java config, using the plain AppEngineConfiguration builder while expecting Spring-managed transactions, transactionManager bean defined but not injected.","solutions":["Set the transactionManager property on SpringAppEngineConfiguration to a Spring PlatformTransactionManager bean (e.g. DataSourceTransactionManager)","Ensure the transactionManager bean is defined in the application context","If you do not need Spring transactions, use org.flowable.app.engine.AppEngineConfiguration instead"],"exampleFix":"// before\nSpringAppEngineConfiguration cfg = new SpringAppEngineConfiguration();\ncfg.setDataSource(dataSource); // transactionManager missing\n// after\nSpringAppEngineConfiguration cfg = new SpringAppEngineConfiguration();\ncfg.setDataSource(dataSource);\ncfg.setTransactionManager(new DataSourceTransactionManager(dataSource));","handlingStrategy":"validation","validationCode":"if (cfg instanceof SpringAppEngineConfiguration sac && sac.getTransactionManager() == null) {\n    throw new IllegalStateException(\"SpringAppEngineConfiguration requires a transactionManager\");\n}","typeGuard":null,"tryCatchPattern":"try { appEngine = cfg.buildAppEngine(); } catch (FlowableException e) { log.error(\"Engine init failed: {}\", e.getMessage()); }","preventionTips":["Always pair SpringAppEngineConfiguration with a PlatformTransactionManager bean","Use plain AppEngineConfiguration when Spring transaction management is not wanted","Add the transactionManager property to engine config templates/checked-in defaults"],"tags":["spring","flowable","configuration","transaction"],"backgroundTag":"missing-required-config-field","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}