{"record":{"id":"28956679735a0523","repo":"flowable/flowable-engine","slug":"processengineconfiguration-is-required","errorCode":null,"errorMessage":"ProcessEngineConfiguration is required","messagePattern":"ProcessEngineConfiguration is required","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine-configurator/src/main/java/org/flowable/engine/configurator/ProcessEngineConfigurator.java","lineNumber":119,"sourceCode":"                dbSqlSessionFactory.getDeletionOrder().add(clazz);\n            }\n        }\n    }\n\n    @Override\n    protected List<Class<? extends Entity>> getEntityInsertionOrder() {\n        return EntityDependencyOrder.INSERT_ORDER;\n    }\n\n    @Override\n    protected List<Class<? extends Entity>> getEntityDeletionOrder() {\n        return EntityDependencyOrder.DELETE_ORDER;\n    }\n\n    @Override\n    protected ProcessEngine buildEngine() {\n        if (processEngineConfiguration == null) {\n            throw new FlowableException(\"ProcessEngineConfiguration is required\");\n        }\n\n        return processEngineConfiguration.buildProcessEngine();\n    }\n\n    public ProcessEngineConfiguration getProcessEngineConfiguration() {\n        return processEngineConfiguration;\n    }\n\n    public ProcessEngineConfigurator setProcessEngineConfiguration(ProcessEngineConfiguration processEngineConfiguration) {\n        this.processEngineConfiguration = processEngineConfiguration;\n        return this;\n    }\n\n    protected JobServiceConfiguration getJobServiceConfiguration(AbstractEngineConfiguration engineConfiguration) {\n        if (engineConfiguration.getServiceConfigurations().containsKey(EngineConfigurationConstants.KEY_JOB_SERVICE_CONFIG)) {\n            return (JobServiceConfiguration) engineConfiguration.getServiceConfigurations().get(EngineConfigurationConstants.KEY_JOB_SERVICE_CONFIG);\n        }","sourceCodeStart":101,"sourceCodeEnd":137,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine-configurator/src/main/java/org/flowable/engine/configurator/ProcessEngineConfigurator.java#L101-L137","documentation":"ProcessEngineConfigurator.buildEngine() refuses to build a process engine when its `processEngineConfiguration` field is null. Flowable's configurator infra calls buildEngine() after configuring, and the engine cannot be constructed without a ProcessEngineConfiguration. This guards against a configurator that was registered but never given its configuration.","triggerScenarios":"A ProcessEngineConfigurator instance is created and registered with an engine configuration (e.g. via setConfigurators/addConfigurator), but setProcessEngineConfiguration(...) was never called on it before the engine lifecycle invokes buildEngine().","commonSituations":"Manually instantiating a configurator and adding it to a configuration without wiring the configuration back into it; custom engine bootstrap code that copies configurators between configurations; Spring wiring that forgot the configuration property.","solutions":["Call setProcessEngineConfiguration(config) on the configurator before engine build","Instead of manual construction, let the owning engine configuration create/attach the configurator (e.g. via its dedicated configurer property such as processEngineConfiguration or the module's own configurator setter)","If copying configurators, ensure the configuration reference is transferred too"],"exampleFix":"// before\nProcessEngineConfigurator configurator = new ProcessEngineConfigurator();\nconfig.addConfigurator(configurator);\n\n// after\nProcessEngineConfigurator configurator = new ProcessEngineConfigurator();\nconfigurator.setProcessEngineConfiguration(config);\nconfig.addConfigurator(configurator);","handlingStrategy":"validation","validationCode":"if (configurator.getProcessEngineConfiguration() == null) {\n    configurator.setProcessEngineConfiguration(engineConfig);\n}\nengineConfig.addConfigurator(configurator);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always pair new ProcessEngineConfigurator() with an immediate setProcessEngineConfiguration call","Prefer dedicated configuration properties over generic addConfigurator where the framework supplies the configuration"],"tags":["flowable","configuration","engine-bootstrap"],"backgroundTag":"missing-required-config","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"}