{"record":{"id":"c7146f150b902091","repo":"flowable/flowable-engine","slug":"expected-dmnengine-configuration-to-be-of-type-spr","errorCode":null,"errorMessage":"Expected dmnEngine configuration to be of type SpringDmnEngineConfiguration but was <actualType>","messagePattern":"Expected dmnEngine configuration to be of type SpringDmnEngineConfiguration but was <actualType>","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-dmn-spring-configurator/src/main/java/org/flowable/dmn/spring/configurator/SpringDmnEngineConfigurator.java","lineNumber":31,"sourceCode":"package org.flowable.dmn.spring.configurator;\n\nimport org.flowable.common.engine.impl.AbstractEngineConfiguration;\nimport org.flowable.common.spring.SpringEngineConfiguration;\nimport org.flowable.dmn.engine.configurator.DmnEngineConfigurator;\nimport org.flowable.dmn.spring.SpringDmnEngineConfiguration;\n\n/**\n * @author Tijs Rademakers\n * @author Joram Barrez\n */\npublic class SpringDmnEngineConfigurator extends DmnEngineConfigurator {\n\n    @Override\n    public void configure(AbstractEngineConfiguration engineConfiguration) {\n        if (dmnEngineConfiguration == null) {\n            dmnEngineConfiguration = new SpringDmnEngineConfiguration();\n        } else if (!(dmnEngineConfiguration instanceof SpringDmnEngineConfiguration)) {\n            throw new IllegalArgumentException(\"Expected dmnEngine configuration to be of type \"\n                + SpringDmnEngineConfiguration.class + \" but was \" + dmnEngineConfiguration.getClass());\n        }\n        initialiseCommonProperties(engineConfiguration, dmnEngineConfiguration);\n        \n        SpringEngineConfiguration springEngineConfiguration = (SpringEngineConfiguration) engineConfiguration;\n        ((SpringDmnEngineConfiguration) dmnEngineConfiguration).setTransactionManager(springEngineConfiguration.getTransactionManager());\n        if (dmnEngineConfiguration.getBeans() == null) {\n            dmnEngineConfiguration.setBeans(springEngineConfiguration.getBeans());\n        }\n\n        initEngine();\n        \n        initServiceConfigurations(engineConfiguration, dmnEngineConfiguration);\n    }\n}\n","sourceCodeStart":13,"sourceCodeEnd":47,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-dmn-spring-configurator/src/main/java/org/flowable/dmn/spring/configurator/SpringDmnEngineConfigurator.java#L13-L47","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Set the configurator's dmnEngineConfiguration to a SpringDmnEngineConfiguration instance.","If you don't need a custom config, omit it and let the configurator create the default SpringDmnEngineConfiguration.","If you have a custom configuration class, make it extend SpringDmnEngineConfiguration.","Read the exception message: the actual wrong type is printed after 'but was'."],"exampleFix":"// before\nSpringDmnEngineConfigurator configurator = new SpringDmnEngineConfigurator();\nconfigurator.setDmnEngineConfiguration(new StandaloneDmnEngineConfiguration());\n// after\nSpringDmnEngineConfigurator configurator = new SpringDmnEngineConfigurator();\nconfigurator.setDmnEngineConfiguration(new SpringDmnEngineConfiguration());","handlingStrategy":"validation","validationCode":"if (dmnEngineConfig != null && !(dmnEngineConfig instanceof SpringDmnEngineConfiguration)) {\n  throw new IllegalStateException('dmnEngineConfiguration must be SpringDmnEngineConfiguration, got ' + dmnEngineConfig.getClass());\n}","typeGuard":"if (!(dmnEngineConfiguration instanceof SpringDmnEngineConfiguration)) { throw new IllegalArgumentException('use SpringDmnEngineConfiguration in Spring setups'); }","tryCatchPattern":"try { configurator.configure(engineConfiguration); }\ncatch (IllegalArgumentException e) { throw new ConfigurationException('Check dmnEngineConfiguration type: ' + e.getMessage(), e); }","preventionTips":["In Spring apps always use SpringDmnEngineConfiguration","Let the configurator create its default config when unsure","Make custom configs extend SpringDmnEngineConfiguration","Update copy-pasted standalone setup when migrating to Spring"],"tags":["spring","configuration","type-mismatch","flowable"],"backgroundTag":"config-type-mismatch","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}