{"record":{"id":"02ee505e6c09c307","repo":"flowable/flowable-engine","slug":"springprocessengineconfigurator-accepts-only-sprin","errorCode":null,"errorMessage":"SpringProcessEngineConfigurator accepts only SpringProcessEngineConfiguration. ","messagePattern":"SpringProcessEngineConfigurator accepts only SpringProcessEngineConfiguration\\. ","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-spring-configurator/src/main/java/org/flowable/engine/spring/configurator/SpringProcessEngineConfigurator.java","lineNumber":34,"sourceCode":"import org.flowable.common.engine.impl.AbstractEngineConfiguration;\nimport org.flowable.common.spring.SpringEngineConfiguration;\nimport org.flowable.engine.configurator.ProcessEngineConfigurator;\nimport org.flowable.spring.SpringProcessEngineConfiguration;\n\n/**\n * @author Tijs Rademakers\n * @author Joram Barrez\n */\npublic class SpringProcessEngineConfigurator extends ProcessEngineConfigurator {\n\n    @Override\n    public void configure(AbstractEngineConfiguration engineConfiguration) {\n        if (processEngineConfiguration == null) {\n            processEngineConfiguration = new SpringProcessEngineConfiguration();\n        }\n\n        if (!(processEngineConfiguration instanceof SpringProcessEngineConfiguration)) {\n            throw new FlowableException(\"SpringProcessEngineConfigurator accepts only SpringProcessEngineConfiguration. \" + processEngineConfiguration.getClass().getName());\n        }\n\n        initialiseCommonProperties(engineConfiguration, processEngineConfiguration);\n\n        SpringEngineConfiguration springEngineConfiguration = (SpringEngineConfiguration) engineConfiguration;\n        SpringProcessEngineConfiguration springProcessEngineConfiguration = (SpringProcessEngineConfiguration) processEngineConfiguration;\n        springProcessEngineConfiguration.setTransactionManager(springEngineConfiguration.getTransactionManager());\n        if (springProcessEngineConfiguration.getBeans() == null) {\n            springProcessEngineConfiguration.setBeans(springProcessEngineConfiguration.getBeans());\n        }\n\n        initEngine();\n\n        initServiceConfigurations(engineConfiguration, processEngineConfiguration);\n    }\n\n    @Override\n    public SpringProcessEngineConfiguration getProcessEngineConfiguration() {","sourceCodeStart":16,"sourceCodeEnd":52,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-spring-configurator/src/main/java/org/flowable/engine/spring/configurator/SpringProcessEngineConfigurator.java#L16-L52","documentation":"SpringProcessEngineConfigurator.configure checks that the engine configuration it holds is a SpringProcessEngineConfiguration before applying Spring-specific wiring. If the stored processEngineConfiguration is a different ProcessEngineConfiguration subtype, the configurator cannot proceed and throws FlowableException including the offending class name.","triggerScenarios":"A configurator whose processEngineConfiguration field was set (via constructor or setter) to a non-Spring ProcessEngineConfiguration is registered, then configure(AbstractEngineConfiguration) is called during engine build.","commonSituations":"Using SpringProcessEngineConfigurator in a non-Spring engine setup; custom configurator subclass passing a plain ProcessEngineConfiguration; mixing configurators between standalone and Spring engine builds.","solutions":["Ensure the configurator is configured with a SpringProcessEngineConfiguration instance","Remove SpringProcessEngineConfigurator from standalone (non-Spring) engine configurations","Set the configuration explicitly: new SpringProcessEngineConfigurator(new SpringProcessEngineConfiguration())","Audit configurator registration order/types if subclassing"],"exampleFix":"// before\nnew SpringProcessEngineConfigurator(ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration());\n// after\nnew SpringProcessEngineConfigurator(new SpringProcessEngineConfiguration());","handlingStrategy":"type-guard","validationCode":"if (!(configurator.getProcessEngineConfiguration() instanceof SpringProcessEngineConfiguration)) {\n    throw new IllegalArgumentException(\"Provide a SpringProcessEngineConfiguration to SpringProcessEngineConfigurator\");\n}","typeGuard":"boolean isSpringCfg(AbstractEngineConfiguration c) { return c instanceof SpringProcessEngineConfiguration; }","tryCatchPattern":"try { configurator.configure(engineConfiguration); } catch (FlowableException e) { /* inspect e.getMessage() for the offending class name and fix the configurator wiring */ }","preventionTips":["Only register SpringProcessEngineConfigurator with Spring engine setups","Pass a SpringProcessEngineConfiguration via the constructor/setter","Don't share configurator instances between standalone and Spring engines","Unit-test engine configuration assembly"],"tags":["spring","configurator","type-mismatch"],"backgroundTag":"incompatible-source-type","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"}