{"record":{"id":"d0dc0d590fbeb2d5","repo":"flowable/flowable-engine","slug":"no-cdi-bean-manager-available-cannot-publish-even","errorCode":null,"errorMessage":"No cdi bean manager available, cannot publish event.","messagePattern":"No cdi bean manager available, cannot publish event\\.","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cdi/src/main/java/org/flowable/cdi/impl/event/CdiExecutionListener.java","lineNumber":87,"sourceCode":"            return;\r\n        }\r\n\r\n        BusinessProcessEvent event = createEvent(execution);\r\n        Annotation[] qualifiers = getQualifiers(event);\r\n        getBeanManager().getEvent().select(qualifiers).fire(event);\r\n    }\r\n\r\n    protected BusinessProcessEvent createEvent(DelegateExecution execution) {\r\n        ProcessDefinition processDefinition = ProcessDefinitionUtil.getProcessDefinition(execution.getProcessDefinitionId());\r\n        ProcessEngineConfiguration engineConfiguration = org.flowable.engine.impl.context.Context.getProcessEngineConfiguration(); \r\n        Date now = engineConfiguration.getClock().getCurrentTime();\r\n        return new CdiBusinessProcessEvent(activityId, transitionName, processDefinition, execution, type, execution.getProcessInstanceId(), execution.getId(), now);\r\n    }\r\n\r\n    protected BeanManager getBeanManager() {\r\n        BeanManager bm = BeanManagerLookup.getBeanManager();\r\n        if (bm == null) {\r\n            throw new FlowableException(\"No cdi bean manager available, cannot publish event.\");\r\n        }\r\n        return bm;\r\n    }\r\n\r\n    protected Annotation[] getQualifiers(BusinessProcessEvent event) {\r\n        Annotation businessProcessQualifier = new BusinessProcessLiteral(event.getProcessDefinition().getKey());\r\n        if (type == BusinessProcessEventType.TAKE) {\r\n            return new Annotation[] { businessProcessQualifier, new TakeTransitionLiteral(transitionName) };\r\n        }\r\n        if (type == BusinessProcessEventType.START_ACTIVITY) {\r\n            return new Annotation[] { businessProcessQualifier, new StartActivityLiteral(activityId) };\r\n        }\r\n        if (type == BusinessProcessEventType.END_ACTIVITY) {\r\n            return new Annotation[] { businessProcessQualifier, new EndActivityLiteral(activityId) };\r\n        }\r\n        return new Annotation[] {};\r\n    }\r\n}\r","sourceCodeStart":69,"sourceCodeEnd":105,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cdi/src/main/java/org/flowable/cdi/impl/event/CdiExecutionListener.java#L69-L105","documentation":"CdiExecutionListener.getBeanManager() throws FlowableException when BeanManagerLookup returns null while an execution listener tries to publish a CDI business event. Without a BeanManager the CDI event machinery cannot fire, so the engine aborts rather than silently dropping events. This means the flowable-cdi module is active but no CDI container/BeanManager was resolvable.","triggerScenarios":"An execution listener fires (process/ activity events) and BeanManagerLookup.getBeanManager() returns null — the lookup via JNDI and localInstance both failed, e.g. running in a non-CDI (plain Spring/ plain Java) environment with flowable-cdi on the classpath.","commonSituations":"Embedding Flowable in Spring Boot or a plain SE app while a CDI-aware engine configuration or listener is registered; missing beans.xml / CDI activation; running tests outside an app server without setting the localInstance BeanManager.","solutions":["Set the BeanManager explicitly: BeanManagerLookup.setLocalInstance(beanManager) at startup before the engine processes events.","Remove flowable-cdi from the classpath/ dependencies if you are not using CDI (use flowable-engine + Spring integration instead).","In an app server, ensure CDI is enabled (beans.xml with bean-discovery-mode annotated/all) so JNDI java:comp/BeanManager resolves.","Register non-CDI listeners (FlowableEventListener via engine configuration) instead of CDI execution listeners."],"exampleFix":"// before: engine boots without CDI and listeners fire\n// after: in application startup (CDI env)\nBeanManagerLookup.setLocalInstance(CDI.current().select(BeanManager.class).get());","handlingStrategy":"validation","validationCode":"if (org.flowable.cdi.impl.util.BeanManagerLookup.getBeanManager() == null) {\n    org.flowable.cdi.impl.util.BeanManagerLookup.setLocalInstance(\n        jakarta.enterprise.inject.spi.CDI.current().select(jakarta.enterprise.inject.spi.BeanManager.class).get());\n}","typeGuard":"boolean cdiEventPublishingAvailable() {\n    return org.flowable.cdi.impl.util.BeanManagerLookup.getBeanManager() != null;\n}","tryCatchPattern":"try {\n    executionListener.notify(delivery);\n} catch (org.flowable.common.engine.api.FlowableException e) {\n    if (e.getMessage().contains(\"No cdi bean manager\")) {\n        logger.warn(\"CDI events skipped: no BeanManager\");\n    } else { throw e; }\n}","preventionTips":["Bootstrap-time check: fail fast at startup if BeanManagerLookup.getBeanManager() is null in a CDI app.","Don't ship flowable-cdi to non-CDI deployments (Spring Boot should use flowable-spring instead).","Ensure beans.xml/ CDI activation so JNDI BeanManager binding exists.","Set localInstance explicitly in embedded/SE/test environments."],"tags":["flowable","cdi","bean-manager","event-listener"],"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"}