flowable/flowable-engine · error · FlowableException

transactionManager is required property for SpringDmnEngineC

Error message

transactionManager is required property for SpringDmnEngineConfiguration, use StandaloneDmnEngineConfiguration otherwise

What it means

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.

Source

Thrown at modules/flowable-dmn-spring/src/main/java/org/flowable/dmn/spring/SpringDmnEngineConfiguration.java:97

            beans = new SpringBeanFactoryProxyMap(applicationContext);
        }
    }

    public void setTransactionSynchronizationAdapterOrder(Integer transactionSynchronizationAdapterOrder) {
        this.transactionSynchronizationAdapterOrder = transactionSynchronizationAdapterOrder;
    }

    @Override
    public void initDefaultCommandConfig() {
        if (defaultCommandConfig == null) {
            defaultCommandConfig = new CommandConfig().setContextReusePossible(true);
        }
    }

    @Override
    public CommandInterceptor createTransactionInterceptor() {
        if (transactionManager == null) {
            throw new FlowableException("transactionManager is required property for SpringDmnEngineConfiguration, use " + StandaloneDmnEngineConfiguration.class.getName() + " otherwise");
        }

        return new SpringTransactionInterceptor(transactionManager);
    }

    @Override
    public void initTransactionContextFactory() {
        if (transactionContextFactory == null && transactionManager != null) {
            transactionContextFactory = new SpringTransactionContextFactory(transactionManager, transactionSynchronizationAdapterOrder);
        }
    }

    protected void autoDeployResources(DmnEngine dmnEngine) {
        if (deploymentResources != null && deploymentResources.length > 0) {
            final AutoDeploymentStrategy<DmnEngine> strategy = getAutoDeploymentStrategy(deploymentMode);
            strategy.deployResources(deploymentName, deploymentResources, dmnEngine);
        }
    }

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Set the transaction manager: config.setTransactionManager(platformTransactionManager) before building the engine.
  2. If you don't need Spring transaction management, use StandaloneDmnEngineConfiguration instead.
  3. In XML, add <property name="transactionManager" ref="transactionManager"/> to the configuration bean.
  4. If using DmnEngineFactoryBean/Spring wiring, ensure the transactionManager bean exists in the context and the reference name matches.

Example fix

// before
SpringDmnEngineConfiguration config = new SpringDmnEngineConfiguration();
config.setDataSource(dataSource);
DmnEngine engine = config.buildDmnEngine();
// after
SpringDmnEngineConfiguration config = new SpringDmnEngineConfiguration();
config.setDataSource(dataSource);
config.setTransactionManager(new DataSourceTransactionManager(dataSource));
DmnEngine engine = config.buildDmnEngine();
Defensive patterns

Strategy: validation

Validate before calling

if (config instanceof SpringDmnEngineConfiguration && config.getTransactionManager() == null) {
  throw new IllegalStateException('set transactionManager on SpringDmnEngineConfiguration or use StandaloneDmnEngineConfiguration');
}

Try / catch

try { return config.buildDmnEngine(); }
catch (FlowableException e) { if (e.getMessage().contains("transactionManager is required")) { throw new ConfigurationException('Wire a PlatformTransactionManager into SpringDmnEngineConfiguration', e); } throw e; }

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Understand the failure class

Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.

Related errors


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/9ca9f49f650155c1. Report an issue: GitHub.