flowable/flowable-engine · error · FlowableException

transactionManager is required property for SpringAppEngineC

Error message

transactionManager is required property for SpringAppEngineConfiguration, use org.flowable.app.engine.AppEngineConfiguration otherwise

What it means

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.

Source

Thrown at modules/flowable-app-engine-spring/src/main/java/org/flowable/app/spring/SpringAppEngineConfiguration.java:98

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

        return new SpringTransactionInterceptor(transactionManager);
    }

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

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

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Set the transactionManager property on SpringAppEngineConfiguration to a Spring PlatformTransactionManager bean (e.g. DataSourceTransactionManager)
  2. Ensure the transactionManager bean is defined in the application context
  3. If you do not need Spring transactions, use org.flowable.app.engine.AppEngineConfiguration instead

Example fix

// before
SpringAppEngineConfiguration cfg = new SpringAppEngineConfiguration();
cfg.setDataSource(dataSource); // transactionManager missing
// after
SpringAppEngineConfiguration cfg = new SpringAppEngineConfiguration();
cfg.setDataSource(dataSource);
cfg.setTransactionManager(new DataSourceTransactionManager(dataSource));
Defensive patterns

Strategy: validation

Validate before calling

if (cfg instanceof SpringAppEngineConfiguration sac && sac.getTransactionManager() == null) {
    throw new IllegalStateException("SpringAppEngineConfiguration requires a transactionManager");
}

Try / catch

try { appEngine = cfg.buildAppEngine(); } catch (FlowableException e) { log.error("Engine init failed: {}", e.getMessage()); }

Prevention

When it happens

Trigger: Building a SpringAppEngineConfiguration without setting the transactionManager property, then initializing the engine.

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

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