{"record":{"id":"59b0e4cd76d0a751","repo":"flowable/flowable-engine","slug":"springcmmnengineconfigurator-accepts-only-springcm","errorCode":null,"errorMessage":"SpringCmmnEngineConfigurator accepts only SpringCmmnEngineConfiguration. ${className}","messagePattern":"SpringCmmnEngineConfigurator accepts only SpringCmmnEngineConfiguration\\. (.+?)","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-spring-configurator/src/main/java/org/flowable/cmmn/spring/configurator/SpringCmmnEngineConfigurator.java","lineNumber":38,"sourceCode":"import org.flowable.common.engine.impl.interceptor.EngineConfigurationConstants;\nimport org.flowable.common.spring.SpringEngineConfiguration;\nimport org.flowable.job.service.JobServiceConfiguration;\nimport org.flowable.spring.SpringProcessEngineConfiguration;\n\n/**\n * @author Tijs Rademakers\n * @author Joram Barrez\n */\npublic class SpringCmmnEngineConfigurator extends CmmnEngineConfigurator {\n\n    @Override\n    public void configure(AbstractEngineConfiguration engineConfiguration) {\n        if (cmmnEngineConfiguration == null) {\n            cmmnEngineConfiguration = new SpringCmmnEngineConfiguration();\n        }\n\n        if (!(cmmnEngineConfiguration instanceof SpringCmmnEngineConfiguration)) {\n            throw new FlowableException(\"SpringCmmnEngineConfigurator accepts only SpringCmmnEngineConfiguration. \" + cmmnEngineConfiguration.getClass().getName());\n        }\n\n        initialiseCommonProperties(engineConfiguration, cmmnEngineConfiguration);\n\n        SpringEngineConfiguration springEngineConfiguration = (SpringEngineConfiguration) engineConfiguration;\n        \n        SpringProcessEngineConfiguration springProcessEngineConfiguration = null;\n        if (springEngineConfiguration instanceof SpringProcessEngineConfiguration) {\n            springProcessEngineConfiguration = (SpringProcessEngineConfiguration) springEngineConfiguration;\n        } else {\n            AbstractEngineConfiguration processEngineConfiguration = engineConfiguration.getEngineConfigurations().get(EngineConfigurationConstants.KEY_PROCESS_ENGINE_CONFIG);\n            if (processEngineConfiguration instanceof SpringProcessEngineConfiguration) {\n                springProcessEngineConfiguration = (SpringProcessEngineConfiguration) processEngineConfiguration;\n            }\n        }\n        \n        if (springProcessEngineConfiguration != null) {\n           copyProcessEngineProperties(springProcessEngineConfiguration);","sourceCodeStart":20,"sourceCodeEnd":56,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-spring-configurator/src/main/java/org/flowable/cmmn/spring/configurator/SpringCmmnEngineConfigurator.java#L20-L56","documentation":"FlowableException thrown by SpringCmmnEngineConfigurator.configure when the injected cmmnEngineConfiguration is not an instance of SpringCmmnEngineConfiguration. This configurator only knows how to integrate a Spring-aware CMMN engine configuration, so any other subclass is rejected.","triggerScenarios":"Programmatically adding SpringCmmnEngineConfigurator to an engine configuration and setting configurator.setCmmnEngineConfiguration(...) to a plain CmmnEngineConfiguration or another subclass instead of SpringCmmnEngineConfiguration.","commonSituations":"Spring configurator used in a non-Spring build; copy-pasted setup from the non-Spring CmmnEngineConfigurator; refactoring replaced the configuration class; classloader duplication causing instanceof checks to fail in exotic environments.","solutions":["Set the configurator's configuration to new SpringCmmnEngineConfiguration() or a subclass of it","If you don't need Spring integration, use the plain CmmnEngineConfigurator instead","Let the configurator create its own SpringCmmnEngineConfiguration by leaving cmmnEngineConfiguration unset","Log the actual class name (appended in the message) and compare against the expected type"],"exampleFix":"// before\nconfigurator.setCmmnEngineConfiguration(new CmmnEngineConfiguration());\n// after\nconfigurator.setCmmnEngineConfiguration(new SpringCmmnEngineConfiguration());","handlingStrategy":"validation","validationCode":"if (!(configurator.getCmmnEngineConfiguration() == null || configurator.getCmmnEngineConfiguration() instanceof SpringCmmnEngineConfiguration)) { throw new IllegalStateException(\"use SpringCmmnEngineConfiguration\"); }","typeGuard":"boolean accepts(CmmnEngineConfiguration cfg) { return cfg instanceof SpringCmmnEngineConfiguration; }","tryCatchPattern":"try { configurator.configure(engineConfiguration); } catch (FlowableException e) { if (e.getMessage().startsWith(\"SpringCmmnEngineConfigurator accepts only\")) { log.error(\"wrong config type: {}\", e.getMessage()); } throw e; }","preventionTips":["Only pass SpringCmmnEngineConfiguration (or subclass) to SpringCmmnEngineConfigurator","Use the plain CmmnEngineConfigurator for non-Spring setups","Let the configurator auto-create its configuration by leaving it unset"],"tags":["spring","configuration","configurator"],"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-18T11:17:12.947Z"}