flowable/flowable-engine · error · IllegalArgumentException

Expected dmnEngine configuration to be of type SpringDmnEngi

Error message

Expected dmnEngine configuration to be of type SpringDmnEngineConfiguration but was <actualType>

What it means

SpringDmnEngineConfigurator.configure() wires the DMN engine configuration into an engine-wide configuration. If a dmnEngineConfiguration was injected but is not a SpringDmnEngineConfiguration (it cannot receive the Spring transaction manager), it throws plain IllegalArgumentException naming the actual class. If none was set, it creates a default SpringDmnEngineConfiguration itself.

Source

Thrown at modules/flowable-dmn-spring-configurator/src/main/java/org/flowable/dmn/spring/configurator/SpringDmnEngineConfigurator.java:31

package org.flowable.dmn.spring.configurator;

import org.flowable.common.engine.impl.AbstractEngineConfiguration;
import org.flowable.common.spring.SpringEngineConfiguration;
import org.flowable.dmn.engine.configurator.DmnEngineConfigurator;
import org.flowable.dmn.spring.SpringDmnEngineConfiguration;

/**
 * @author Tijs Rademakers
 * @author Joram Barrez
 */
public class SpringDmnEngineConfigurator extends DmnEngineConfigurator {

    @Override
    public void configure(AbstractEngineConfiguration engineConfiguration) {
        if (dmnEngineConfiguration == null) {
            dmnEngineConfiguration = new SpringDmnEngineConfiguration();
        } else if (!(dmnEngineConfiguration instanceof SpringDmnEngineConfiguration)) {
            throw new IllegalArgumentException("Expected dmnEngine configuration to be of type "
                + SpringDmnEngineConfiguration.class + " but was " + dmnEngineConfiguration.getClass());
        }
        initialiseCommonProperties(engineConfiguration, dmnEngineConfiguration);
        
        SpringEngineConfiguration springEngineConfiguration = (SpringEngineConfiguration) engineConfiguration;
        ((SpringDmnEngineConfiguration) dmnEngineConfiguration).setTransactionManager(springEngineConfiguration.getTransactionManager());
        if (dmnEngineConfiguration.getBeans() == null) {
            dmnEngineConfiguration.setBeans(springEngineConfiguration.getBeans());
        }

        initEngine();
        
        initServiceConfigurations(engineConfiguration, dmnEngineConfiguration);
    }
}

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Set the configurator's dmnEngineConfiguration to a SpringDmnEngineConfiguration instance.
  2. If you don't need a custom config, omit it and let the configurator create the default SpringDmnEngineConfiguration.
  3. If you have a custom configuration class, make it extend SpringDmnEngineConfiguration.
  4. Read the exception message: the actual wrong type is printed after 'but was'.

Example fix

// before
SpringDmnEngineConfigurator configurator = new SpringDmnEngineConfigurator();
configurator.setDmnEngineConfiguration(new StandaloneDmnEngineConfiguration());
// after
SpringDmnEngineConfigurator configurator = new SpringDmnEngineConfigurator();
configurator.setDmnEngineConfiguration(new SpringDmnEngineConfiguration());
Defensive patterns

Strategy: validation

Validate before calling

if (dmnEngineConfig != null && !(dmnEngineConfig instanceof SpringDmnEngineConfiguration)) {
  throw new IllegalStateException('dmnEngineConfiguration must be SpringDmnEngineConfiguration, got ' + dmnEngineConfig.getClass());
}

Type guard

if (!(dmnEngineConfiguration instanceof SpringDmnEngineConfiguration)) { throw new IllegalArgumentException('use SpringDmnEngineConfiguration in Spring setups'); }

Try / catch

try { configurator.configure(engineConfiguration); }
catch (IllegalArgumentException e) { throw new ConfigurationException('Check dmnEngineConfiguration type: ' + e.getMessage(), e); }

Prevention

When it happens

Trigger: Programmatically configuring an engine configuration (e.g. SpringProcessEngineConfiguration/SpringEngineConfiguration) and setting its dmnEngineConfigurator's dmnEngineConfiguration to StandaloneDmnEngineConfiguration or another non-Spring subclass instead of SpringDmnEngineConfiguration.

Common situations: Copy-pasted standalone setup code into a Spring Boot app, swapping configuration classes after migrating from standalone to Spring, or a custom DmnEngineConfiguration subclass that does not extend SpringDmnEngineConfiguration.

Related errors


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