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
- Set the transaction manager on the configuration: cmmnEngineConfiguration.setTransactionManager(platformTransactionManager) before engine build/init.
- Inject the Spring-managed PlatformTransactionManager bean (e.g. DataSourceTransactionManager or JpaTransactionManager) into your configuration class.
- If you do not use Spring transaction management, switch to org.flowable.cmmn.engine.CmmnEngineConfiguration instead of the Spring subclass.
- 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
- Always inject the Spring PlatformTransactionManager bean when using the Spring engine configuration subclass.
- Prefer Spring Boot starters/auto-configuration over manual configuration construction.
- Add a startup-time assertion that transactionManager is set before building the engine.
- Use the non-Spring CmmnEngineConfiguration when Spring transaction management is not needed.
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
- no org.flowable.app.engine.AppEngine defined in the applicat
- transactionManager is required property for SpringAppEngineC
- Expected dmnEngine configuration to be of type SpringDmnEngi
- transactionManager is required property for SpringDmnEngineC
- couldn't initialize process engine from spring configuration
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/703af08f828e22ad.
Report an issue: GitHub.