flowable/flowable-engine · error · FlowableException

transactionManager is required property for SpringCmmnEngine

Error message

transactionManager is required property for SpringCmmnEngineConfiguration, use " + CmmnEngineConfiguration.class.getName() + " otherwise

What it means

SpringCmmnEngineConfiguration requires a Spring PlatformTransactionManager to build its transaction interceptor; without one it cannot participate in Spring-managed transactions. The engine throws this FlowableException during createTransactionInterceptor to fail fast instead of running commands without proper transaction handling. Use the non-Spring CmmnEngineConfiguration if you don't need Spring transaction management.

Source

Thrown at modules/flowable-cmmn-spring/src/main/java/org/flowable/cmmn/spring/SpringCmmnEngineConfiguration.java:104

    protected EngineConfigurator createDefaultEventRegistryEngineConfigurator() {
        return new SpringEventRegistryConfigurator();
    }

    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 SpringCmmnEngineConfiguration, use " + CmmnEngineConfiguration.class.getName() + " otherwise");
        }

        return new SpringTransactionInterceptor(transactionManager);
    }

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

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

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Set the transaction manager on the configuration: cmmnEngineConfiguration.setTransactionManager(platformTransactionManager) before engine build/init.
  2. Inject the Spring-managed PlatformTransactionManager bean (e.g. DataSourceTransactionManager or JpaTransactionManager) into your configuration class.
  3. If you do not use Spring transaction management, switch to org.flowable.cmmn.engine.CmmnEngineConfiguration instead of the Spring subclass.
  4. If using Spring Boot, ensure flowable-spring-boot-starter auto-configuration is on the classpath so the transaction manager is wired automatically.

Example fix

// before
SpringCmmnEngineConfiguration cfg = new SpringCmmnEngineConfiguration();
cfg.setDataSource(dataSource);
CmmnEngine engine = cfg.buildCmmnEngine();
// after
SpringCmmnEngineConfiguration cfg = new SpringCmmnEngineConfiguration();
cfg.setDataSource(dataSource);
cfg.setTransactionManager(new DataSourceTransactionManager(dataSource));
CmmnEngine engine = cfg.buildCmmnEngine();
Defensive patterns

Strategy: validation

Validate before calling

if (cfg.getTransactionManager() == null) {
    cfg.setTransactionManager(applicationContext.getBean(PlatformTransactionManager.class));
}

Type guard

boolean hasTxManager(SpringCmmnEngineConfiguration cfg) { return cfg.getTransactionManager() != null; }

Try / catch

try {
    cmmnEngine = cfg.buildCmmnEngine();
} catch (FlowableException e) {
    if (e.getMessage() != null && e.getMessage().contains("transactionManager is required")) {
        throw new IllegalStateException("Configure a PlatformTransactionManager for SpringCmmnEngineConfiguration", e);
    }
    throw e;
}

Prevention

When it happens

Trigger: Calling createTransactionInterceptor() (directly or via engine initialization) on a SpringCmmnEngineConfiguration whose transactionManager property was never set, e.g. when creating the configuration programmatically without calling setTransactionManager, or when the Spring bean of type PlatformTransactionManager was not injected.

Common situations: Building the CMMN engine manually in a Spring Boot app without @Autowired-ing the PlatformTransactionManager; a misnamed or missing DataSourceTransactionManager/ JpaTransactionManager bean; copying XML/Java config from the non-Spring engine docs; upgrading Flowable and constructing the configuration in code instead of relying on auto-configuration.

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/703af08f828e22ad. Report an issue: GitHub.