{"record":{"id":"28400ddf896c89f0","repo":"flowable/flowable-engine","slug":"could-not-find-an-implementation-of-the-org-flowab-28400d","errorCode":null,"errorMessage":"Could not find an implementation of the org.flowable.cdi.impl.cmmn.CmmnEngineLookup service returning a non-null cmmnEngine. Giving up.","messagePattern":"Could not find an implementation of the org\\.flowable\\.cdi\\.impl\\.cmmn\\.CmmnEngineLookup service returning a non-null cmmnEngine\\. Giving up\\.","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"critical","filePath":"modules/flowable-cmmn-cdi/src/main/java/org/flowable/cdi/impl/FlowableCmmnExtension.java","lineNumber":89,"sourceCode":"                return (-1) * ((Integer) o1.getPrecedence()).compareTo(o2.getPrecedence());\n            }\n        });\n\n        CmmnEngine cmmnEngine = null;\n\n        for (CmmnEngineLookup cmmnEngineLookup : discoveredLookups) {\n            cmmnEngine = cmmnEngineLookup.getCmmnEngine();\n            if (cmmnEngine != null) {\n                this.cmmnEngineLookup = cmmnEngineLookup;\n                LOGGER.debug(\"CmmnEngineLookup service {} returned cmmn engine.\", cmmnEngineLookup.getClass());\n                break;\n            } else {\n                LOGGER.debug(\"CmmnEngineLookup service {} returned 'null' value.\", cmmnEngineLookup.getClass());\n            }\n        }\n\n        if (cmmnEngineLookup == null) {\n            throw new FlowableException(\n                    \"Could not find an implementation of the \" + CmmnEngineLookup.class.getName() + \" service returning a non-null cmmnEngine. Giving up.\");\n        }\n\n        Bean<FlowableCmmnServices> flowableCmmnServicesBean = (Bean<FlowableCmmnServices>) beanManager.getBeans(FlowableCmmnServices.class).stream()\n                .findAny()\n                .orElseThrow(\n                        () -> new IllegalStateException(\"CDI BeanManager cannot find an instance of requested type \" + FlowableCmmnServices.class.getName()));\n        FlowableCmmnServices services = (FlowableCmmnServices) beanManager\n                .getReference(flowableCmmnServicesBean, FlowableCmmnServices.class, beanManager.createCreationalContext(flowableCmmnServicesBean));\n        services.setCmmnEngine(cmmnEngine);\n\n        return cmmnEngine;\n    }\n\n    public void beforeShutdown(@Observes BeforeShutdown event) {\n        if (cmmnEngineLookup != null) {\n            cmmnEngineLookup.ungetCmmnEngine();\n            cmmnEngineLookup = null;","sourceCodeStart":71,"sourceCodeEnd":107,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-cdi/src/main/java/org/flowable/cdi/impl/FlowableCmmnExtension.java#L71-L107","documentation":"FlowableCmmnExtension (a CDI extension) resolves the CMMN engine by iterating registered CmmnEngineLookup service implementations. If none returns a non-null engine, it throws FlowableException because the CDI environment cannot obtain a CMMN engine to wire into managed beans.","triggerScenarios":"Deploying a CDI application with FlowableCmmnExtension enabled but with no CmmnEngineLookup service implementation registered (via META-INF/services) or every lookup returning null because the CMMN engine was never built/started.","commonSituations":"Missing service descriptor file META-INF/services/org.flowable.cdi.impl.cmmn.CmmnEngineLookup; forgetting to create the CmmnEngue in a StandaloneInit-like bootstrap; mixing flowable-cmmn-cdi without engine configuration; wrong bean archive discovery.","solutions":["Register a CmmnEngineLookup implementation in META-INF/services/org.flowable.cdi.impl.cmmn.CmmnEngineLookup","Ensure the lookup returns a built CmmnEngine (build via CmmnEngineConfiguration and expose it)","Verify flowable-cmmn-engine is on the classpath and the engine initializes before afterDeploymentValidation","Check that the CDI extension is not active in modules that intentionally have no CMMN engine"],"exampleFix":"// before\n// (no service file)\n// after\n// file: src/main/resources/META-INF/services/org.flowable.cdi.impl.cmmn.CmmnEngineLookup\n// content: com.myapp.MyCmmnEngineLookup","handlingStrategy":"validation","validationCode":"boolean lookupPresent = getClass().getClassLoader()\n    .getResources(\"META-INF/services/org.flowable.cdi.impl.cmmn.CmmnEngineLookup\").hasMoreElements();\nif (!lookupPresent) throw new IllegalStateException(\"No CmmnEngineLookup registered for flowable-cmmn-cdi\");","typeGuard":"CmmnEngine engine = cmmnEngineLookup != null ? cmmnEngineLookup.getCmmnEngine() : null;\nif (engine == null) throw new IllegalStateException(\"CmmnEngineLookup returned null engine\");","tryCatchPattern":"try { cmmnExtension.bootstrap(); } catch (FlowableException e) { throw new IllegalStateException(\"CDI CMMN engine not configured: \" + e.getMessage(), e); }","preventionTips":["Ship META-INF/services/org.flowable.cdi.impl.cmmn.CmmnEngineLookup in apps using flowable-cmmn-cdi","Ensure the CMMN engine is built/started before CDI afterDeploymentValidation runs","Include flowable-cmmn-engine on the classpath","Smoke-test engine lookup in integration tests"],"tags":["java","cdi","cmmn","engine-lookup","configuration"],"backgroundTag":"missing-dependency","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"}