{"record":{"id":"00cbbbf179cf38ff","repo":"flowable/flowable-engine","slug":"expected-idmengine-configuration-to-be-of-type-spr","errorCode":null,"errorMessage":"Expected idmEngine configuration to be of type SpringIdmEngineConfiguration but was ${actualType}","messagePattern":"Expected idmEngine configuration to be of type SpringIdmEngineConfiguration but was (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-idm-spring-configurator/src/main/java/org/flowable/idm/spring/configurator/SpringIdmEngineConfigurator.java","lineNumber":30,"sourceCode":" */\npackage org.flowable.idm.spring.configurator;\n\nimport org.flowable.common.engine.impl.AbstractEngineConfiguration;\nimport org.flowable.common.spring.SpringEngineConfiguration;\nimport org.flowable.idm.engine.configurator.IdmEngineConfigurator;\nimport org.flowable.idm.spring.SpringIdmEngineConfiguration;\n\n/**\n * @author Tijs Rademakers\n */\npublic class SpringIdmEngineConfigurator extends IdmEngineConfigurator {\n\n    @Override\n    public void configure(AbstractEngineConfiguration engineConfiguration) {\n        if (idmEngineConfiguration == null) {\n            idmEngineConfiguration = new SpringIdmEngineConfiguration();\n        } else if (!(idmEngineConfiguration instanceof SpringIdmEngineConfiguration)) {\n            throw new IllegalArgumentException(\"Expected idmEngine configuration to be of type \"\n                + SpringIdmEngineConfiguration.class + \" but was \" + idmEngineConfiguration.getClass());\n        }\n        initialiseCommonProperties(engineConfiguration, idmEngineConfiguration);\n        SpringEngineConfiguration springEngineConfiguration = (SpringEngineConfiguration) engineConfiguration;\n        ((SpringIdmEngineConfiguration) idmEngineConfiguration).setTransactionManager(springEngineConfiguration.getTransactionManager());\n\n        initEngine();\n\n        initServiceConfigurations(engineConfiguration, idmEngineConfiguration);\n    }\n\n    public SpringIdmEngineConfigurator setIdmEngineConfiguration(SpringIdmEngineConfiguration idmEngineConfiguration) {\n        this.idmEngineConfiguration = idmEngineConfiguration;\n        return this;\n    }\n\n}\n","sourceCodeStart":12,"sourceCodeEnd":48,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-idm-spring-configurator/src/main/java/org/flowable/idm/spring/configurator/SpringIdmEngineConfigurator.java#L12-L48","documentation":"Plain IllegalArgumentException thrown by SpringIdmEngineConfigurator.configure when the configured idmEngineConfiguration object is not an instance of SpringIdmEngineConfiguration. The Spring configurator requires its Spring-aware configuration (it sets the Spring transaction manager on it), so a plain IdmEngineConfiguration cannot be used with this configurator.","triggerScenarios":"Programmatic engine configuration where engineConfig.setIdmEngineConfiguration(new IdmEngineConfiguration()) (standalone config) is combined with new SpringIdmEngineConfigurator(), then any engine (e.g. ProcessEngineConfiguration) is built.","commonSituations":"Mixing Spring and non-Spring flowable-idm setups after copying configuration code from a standalone example; upgrading Flowable and keeping an old non-Spring idm configuration class in a Spring app; bean of wrong type wired by Spring autowiring.","solutions":["Set idmEngineConfiguration to a SpringIdmEngineConfiguration instance on the configurator","Remove SpringIdmEngineConfigurator if you intentionally run a standalone (non-Spring) idm engine, using StandaloneIdmEngineConfiguration instead","Let the configurator create its own default config: don't call setIdmEngineConfiguration at all (it lazily creates SpringIdmEngineConfiguration)","Check Spring bean definitions so the injected type is SpringIdmEngineConfiguration"],"exampleFix":"// before\nSpringIdmEngineConfigurator cfg = new SpringIdmEngineConfigurator();\ncfg.setIdmEngineConfiguration(new IdmEngineConfiguration());\n// after\nSpringIdmEngineConfigurator cfg = new SpringIdmEngineConfigurator();\ncfg.setIdmEngineConfiguration(new SpringIdmEngineConfiguration());","handlingStrategy":"validation","validationCode":"// Java guard before configuring\nif (!(cfg.getIdmEngineConfiguration() instanceof SpringIdmEngineConfiguration)\n    && cfg.getIdmEngineConfiguration() != null) {\n  cfg.setIdmEngineConfiguration(new SpringIdmEngineConfiguration());\n}","typeGuard":"// Java instanceof narrowing\nif (idmCfg instanceof SpringIdmEngineConfiguration springCfg) {\n    springCfg.setTransactionManager(txManager);\n}","tryCatchPattern":null,"preventionTips":["Pair SpringIdmEngineConfigurator only with SpringIdmEngineConfiguration","Or omit setIdmEngineConfiguration and let the configurator default it","Review copied standalone examples for Spring projects"],"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-14T11:17:12.474Z"}