flowable/flowable-engine · error · FlowableIllegalArgumentException

Unsupported transaction propagation:

Error message

Unsupported transaction propagation: 

What it means

SpringTransactionInterceptor.getPropagation maps Flowable's CommandContext transaction propagation enums onto Spring TransactionTemplate constants. Any propagation value other than NOT_SUPPORTED, REQUIRED, or REQUIRES_NEW hits the default branch and throws FlowableIllegalArgumentException. This means the engine configuration carries a propagation value the Spring interceptor cannot translate.

Solutions

  1. Set transaction propagation to one of NOT_SUPPORTED, REQUIRED, or REQUIRES_NEW on the engine configuration
  2. If MANDATORY/SUPPORTS/NEVER semantics are needed, use a non-Spring transaction context factory or a custom interceptor that maps them
  3. Review config properties (e.g. flowable.* propagation settings) for invalid values
  4. Check for version mismatches where the config class offers propagations the interceptor lacks

Example fix

// before
processEngineConfiguration.setTransactionPropagation(Propagation.MANDATORY);
// after
processEngineConfiguration.setTransactionPropagation(Propagation.REQUIRED);
Defensive patterns

Strategy: validation

Validate before calling

Propagation p = config.getTransactionPropagation();
if (p != Propagation.NOT_SUPPORTED && p != Propagation.REQUIRED && p != Propagation.REQUIRES_NEW) {
    throw new IllegalArgumentException("Unsupported propagation for Spring: " + p);
}

Type guard

boolean springSupported(Propagation p) { return p == Propagation.NOT_SUPPORTED || p == Propagation.REQUIRED || p == Propagation.REQUIRES_NEW; }

Try / catch

try { txInterceptor.execute(command); } catch (FlowableIllegalArgumentException e) { /* log invalid propagation config and correct it */ }

Prevention

When it happens

Trigger: SpringProcessEngineConfiguration (or other Spring engine configuration) is given a transaction propagation value not in {NOT_SUPPORTED, REQUIRED, REQUIRES_NEW} and a command executes (execute) or transactionPropagation is queried.

Common situations: Setting propagation programmatically from a config property string that parses to MANDATORY/SUPPORTS/NEVER; version upgrades introducing new enum values not supported by the Spring interceptor; copy-pasting non-Spring (standalone) engine config into a Spring setup.

Related errors


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

Appendix: source

Thrown at modules/flowable-spring-common/src/main/java/org/flowable/common/spring/SpringTransactionInterceptor.java:72

        } else {
            TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
            transactionTemplate.setPropagationBehavior(transactionPropagation);
            return transactionTemplate.execute(status -> next.execute(config, command, commandExecutor));

        }

    }

    private int getPropagation(CommandConfig config) {
        switch (config.getTransactionPropagation()) {
        case NOT_SUPPORTED:
            return TransactionTemplate.PROPAGATION_NOT_SUPPORTED;
        case REQUIRED:
            return TransactionTemplate.PROPAGATION_REQUIRED;
        case REQUIRES_NEW:
            return TransactionTemplate.PROPAGATION_REQUIRES_NEW;
        default:
            throw new FlowableIllegalArgumentException("Unsupported transaction propagation: " + config.getTransactionPropagation());
        }
    }
}

View on GitHub (pinned to d6d39ce1c6)