User Story
As a developer, I want to use CDI to resolve variables
AND
As a developer, I was to use Quarkus ARC dependency injection in to manage objects in ZK
(This is similar to CDI and use the same patterns)
Acceptance Criteria
Update ZK's CDI deleguating variable resolver to support mordern CDI resulution, as well as working with a quarkus ARC.
Details
Attached a POC variable resolver using CDI bean manager instead of retrieving it with JNDI (which is not available in Quarkus)
https://quarkus.io/blog/quarkus-dependency-injection/
if (Arc.container() != null) { InstanceHandle<T> vInstanceHandle = (InstanceHandle<T>) Arc.container().instance(objectClass); if (vInstanceHandle.isAvailable()) { obj = vInstanceHandle.get(); } else { obj = objectClass.newInstance(); } } else { obj = objectClass.newInstance(); }
Debug
This code doesn't work anymore - https://github.com/zkoss/zk/blob/2bdd999620f030f968bfe05325c031dff8fbd14c/zkplus/src/main/java/org/zkoss/zkplus/cdi/CDIUtil.java#L42
Current result
- run integration.cdi.zip
org.zkoss.xel.XelException: Cannot locate the BeanManager for JavaEE 6. at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0 (Native Method) at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:62) at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance (Constructor.java:490) at org.zkoss.lang.Classes.newInstance (Classes.java:77) at org.zkoss.lang.Exceptions.wrap (Exceptions.java:206) at org.zkoss.xel.XelException$Aide.wrap (XelException.java:47) at org.zkoss.zkplus.cdi.CDIUtil.getBeanManager (CDIUtil.java:57) at org.zkoss.zkplus.cdi.DelegatingVariableResolver.<init> (DelegatingVariableResolver.java:42) ... at org.zkoss.zk.ui.select.SelectorComposer.<init> (SelectorComposer.java:91) at org.zkoss.reference.developer.cdi.composer.DynamicComposer.<init> (DynamicComposer.java:28) ... at org.zkoss.zk.ui.impl.AbstractUiFactory.newComposer (AbstractUiFactory.java:176) at org.zkoss.zk.ui.impl.AbstractUiFactory.newComposer (AbstractUiFactory.java:188) at org.zkoss.zk.ui.impl.Utils.newComposer (Utils.java:91) at org.zkoss.zk.ui.metainfo.ComponentInfo.toComposer (ComponentInfo.java:361) at org.zkoss.zk.ui.metainfo.ComponentInfo.toComposers (ComponentInfo.java:331) at org.zkoss.zk.ui.metainfo.ComponentInfo.resolveComposer (ComponentInfo.java:319) at org.zkoss.zk.ui.impl.UiEngineImpl.execCreateChild0 (UiEngineImpl.java:907) at org.zkoss.zk.ui.impl.UiEngineImpl.execCreateChild (UiEngineImpl.java:900) at org.zkoss.zk.ui.impl.UiEngineImpl.execCreate0 (UiEngineImpl.java:787) at org.zkoss.zk.ui.impl.UiEngineImpl.execCreate (UiEngineImpl.java:751) at org.zkoss.zk.ui.impl.UiEngineImpl.execNewPage0 (UiEngineImpl.java:469) at org.zkoss.zk.ui.impl.UiEngineImpl.execNewPage (UiEngineImpl.java:377) at org.zkoss.zk.ui.http.DHtmlLayoutServlet.process (DHtmlLayoutServlet.java:253) ... Caused by: javax.naming.NamingException: WELD-001300: Unable to locate BeanManager at org.jboss.weld.resources.ManagerObjectFactory.getObjectInstance (ManagerObjectFactory.java:62) at javax.naming.spi.NamingManager.getObjectInstance (NamingManager.java:341) at org.eclipse.jetty.jndi.local.localContextRoot.lookup (localContextRoot.java:312) at org.eclipse.jetty.jndi.local.localContextRoot.lookup (localContextRoot.java:338) at javax.naming.InitialContext.lookup (InitialContext.java:409) at org.eclipse.jetty.jndi.NamingContext.lookup (NamingContext.java:462) at org.eclipse.jetty.jndi.NamingContext.lookup (NamingContext.java:486) at org.eclipse.jetty.jndi.NamingContext.lookup (NamingContext.java:486) at org.eclipse.jetty.jndi.NamingContext.lookup (NamingContext.java:500) at org.eclipse.jetty.jndi.java.javaRootURLContext.lookup (javaRootURLContext.java:96) at javax.naming.InitialContext.lookup (InitialContext.java:409) at org.zkoss.zkplus.cdi.CDIUtil.getBeanManager (CDIUtil.java:54) at org.zkoss.zkplus.cdi.DelegatingVariableResolver.<init> (DelegatingVariableResolver.java:42) at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0 (Native Method) at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:62) at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance (Constructor.java:490) at org.zkoss.zk.ui.select.Selectors.newVariableResolvers (Selectors.java:258) at org.zkoss.zk.ui.select.SelectorComposer.<init> (SelectorComposer.java:91) at org.zkoss.reference.developer.cdi.composer.DynamicComposer.<init> (DynamicComposer.java:28) at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0 (Native Method) at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:62) at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance (Constructor.java:490) at java.lang.Class.newInstance (Class.java:584) at org.zkoss.zk.ui.impl.AbstractUiFactory.newComposer (AbstractUiFactory.java:176) at org.zkoss.zk.ui.impl.AbstractUiFactory.newComposer (AbstractUiFactory.java:188) at org.zkoss.zk.ui.impl.Utils.newComposer (Utils.java:91) at org.zkoss.zk.ui.metainfo.ComponentInfo.toComposer (ComponentInfo.java:361) at org.zkoss.zk.ui.metainfo.ComponentInfo.toComposers (ComponentInfo.java:331) at org.zkoss.zk.ui.metainfo.ComponentInfo.resolveComposer (ComponentInfo.java:319) at org.zkoss.zk.ui.impl.UiEngineImpl.execCreateChild0 (UiEngineImpl.java:907) at org.zkoss.zk.ui.impl.UiEngineImpl.execCreateChild (UiEngineImpl.java:900)
Workaround
Use javax.enterprise.inject.spi.CDI.current().getBeanManager() instead.
CDIUtil.java