{"record":{"id":"0f7a1afae51075f0","repo":"flowable/flowable-engine","slug":"transactionmanager-is-required-property-for-spring-0f7a1a","errorCode":null,"errorMessage":"transactionManager is required property for SpringIdmEngineConfiguration, use org.flowable.idm.engine.impl.StandaloneIdmEngineConfiguration otherwise","messagePattern":"transactionManager is required property for SpringIdmEngineConfiguration, use org\\.flowable\\.idm\\.engine\\.impl\\.StandaloneIdmEngineConfiguration otherwise","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-idm-spring/src/main/java/org/flowable/idm/spring/SpringIdmEngineConfiguration.java","lineNumber":68,"sourceCode":"        IdmEngine idmEngine = super.buildEngine();\n        IdmEngines.setInitialized(true);\n        return idmEngine;\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 SpringIdmEngineConfiguration, use \" + StandaloneIdmEngineConfiguration.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    @Override\n    public IdmEngineConfiguration setDataSource(DataSource dataSource) {\n        if (dataSource instanceof TransactionAwareDataSourceProxy) {\n            return (IdmEngineConfiguration) super.setDataSource(dataSource);\n        } else {\n            // Wrap datasource in Transaction-aware proxy","sourceCodeStart":50,"sourceCodeEnd":86,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-idm-spring/src/main/java/org/flowable/idm/spring/SpringIdmEngineConfiguration.java#L50-L86","documentation":"FlowableException thrown by SpringIdmEngineConfiguration.createTransactionInterceptor when transactionManager is null. Spring-managed idm engines must run inside Spring transactions; without a PlatformTransactionManager the engine cannot build its transaction interceptor. The message advises using StandaloneIdmEngineConfiguration for non-Spring usage.","triggerScenarios":"Building an idm engine from a SpringIdmEngineConfiguration that never had setTransactionManager(...) called — e.g. constructing it manually instead of through SpringIdmEngineConfigurator, or the Spring transaction manager bean was missing from the application context.","commonSituations":"Manual SpringIdmEngineConfiguration instantiation in tests; Spring context lacking a PlatformTransactionManager (no @EnableTransactionManagement / DataSourceTransactionManager bean); using a non-Spring datasource setup with the Spring configuration class.","solutions":["Set a transaction manager: springIdmEngineConfiguration.setTransactionManager(platformTransactionManager)","Use SpringIdmEngineConfigurator against a SpringEngineConfiguration so the transaction manager is wired automatically","If you don't need Spring transactions, switch to org.flowable.idm.engine.impl.StandaloneIdmEngineConfiguration","Ensure the Spring context defines a transaction manager bean (e.g. DataSourceTransactionManager)"],"exampleFix":"// before\nSpringIdmEngineConfiguration cfg = new SpringIdmEngineConfiguration();\ncfg.setDataSource(dataSource);\nIdmEngine e = cfg.buildEngine(); // throws: no transactionManager\n// after\ncfg.setTransactionManager(new DataSourceTransactionManager(dataSource));","handlingStrategy":"validation","validationCode":"// Java guard before building the engine\nif (springIdmCfg.getTransactionManager() == null) {\n  springIdmCfg.setTransactionManager(new DataSourceTransactionManager(dataSource));\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always call setTransactionManager on SpringIdmEngineConfiguration","Prefer SpringIdmEngineConfigurator for automatic wiring","Use StandaloneIdmEngineConfiguration for non-Spring deployments","Ensure the Spring context has a PlatformTransactionManager bean"],"tags":["spring","configuration","transaction-manager","missing-property","flowable"],"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"}