{"record":{"id":"9ca9f49f650155c1","repo":"flowable/flowable-engine","slug":"transactionmanager-is-required-property-for-spring-9ca9f4","errorCode":null,"errorMessage":"transactionManager is required property for SpringDmnEngineConfiguration, use StandaloneDmnEngineConfiguration otherwise","messagePattern":"transactionManager is required property for SpringDmnEngineConfiguration, use StandaloneDmnEngineConfiguration otherwise","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-dmn-spring/src/main/java/org/flowable/dmn/spring/SpringDmnEngineConfiguration.java","lineNumber":97,"sourceCode":"            beans = new SpringBeanFactoryProxyMap(applicationContext);\n        }\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 SpringDmnEngineConfiguration, use \" + StandaloneDmnEngineConfiguration.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(DmnEngine dmnEngine) {\n        if (deploymentResources != null && deploymentResources.length > 0) {\n            final AutoDeploymentStrategy<DmnEngine> strategy = getAutoDeploymentStrategy(deploymentMode);\n            strategy.deployResources(deploymentName, deploymentResources, dmnEngine);\n        }\n    }","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-dmn-spring/src/main/java/org/flowable/dmn/spring/SpringDmnEngineConfiguration.java#L79-L115","documentation":"SpringDmnEngineConfiguration.createTransactionInterceptor() requires a Spring PlatformTransactionManager to build its SpringTransactionInterceptor. If transactionManager is null, it throws FlowableException telling you to use StandaloneDmnEngineConfiguration for non-Spring, non-transaction-managed setups.","triggerScenarios":"Building a DmnEngine from a SpringDmnEngineConfiguration without calling setTransactionManager(...) — e.g. new SpringDmnEngineConfiguration() constructed programmatically and built directly, or the XML bean missing the transactionManager property.","commonSituations":"Programmatic engine creation in a Spring app where the datasource was set but the transaction manager wasn't wired, copy-pasting a standalone config and only changing the class name, or XML config where the ref to the transaction manager bean is misnamed/absent.","solutions":["Set the transaction manager: config.setTransactionManager(platformTransactionManager) before building the engine.","If you don't need Spring transaction management, use StandaloneDmnEngineConfiguration instead.","In XML, add <property name=\"transactionManager\" ref=\"transactionManager\"/> to the configuration bean.","If using DmnEngineFactoryBean/Spring wiring, ensure the transactionManager bean exists in the context and the reference name matches."],"exampleFix":"// before\nSpringDmnEngineConfiguration config = new SpringDmnEngineConfiguration();\nconfig.setDataSource(dataSource);\nDmnEngine engine = config.buildDmnEngine();\n// after\nSpringDmnEngineConfiguration config = new SpringDmnEngineConfiguration();\nconfig.setDataSource(dataSource);\nconfig.setTransactionManager(new DataSourceTransactionManager(dataSource));\nDmnEngine engine = config.buildDmnEngine();","handlingStrategy":"validation","validationCode":"if (config instanceof SpringDmnEngineConfiguration && config.getTransactionManager() == null) {\n  throw new IllegalStateException('set transactionManager on SpringDmnEngineConfiguration or use StandaloneDmnEngineConfiguration');\n}","typeGuard":null,"tryCatchPattern":"try { return config.buildDmnEngine(); }\ncatch (FlowableException e) { if (e.getMessage().contains(\"transactionManager is required\")) { throw new ConfigurationException('Wire a PlatformTransactionManager into SpringDmnEngineConfiguration', e); } throw e; }","preventionTips":["Always call setTransactionManager before building the engine","Use StandaloneDmnEngineConfiguration outside Spring","In XML, add the transactionManager property with a valid bean ref","Add a startup assertion that the transaction manager is set"],"tags":["spring","configuration","transaction","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"}