Problems with stateless beans in Weld CR 1.0.1 CR2
andygibson.contact.andygibson.net Feb 18, 2010 4:51 PMI've had a problem with JBoss AS 6.0 M1 and 2 and with Weld 1.0.1 CR 1 and 2.
New project, create a JSF page referencing a bean which has a method that returns a string :
<h:form> Message : <h:outputText value="#{messageBean.message}" /> </h:form>
and
@Named public class MessageBean implements Serializable { public String getMessage() { return "This is my messages"; } }
And everything works fine. However, annotate the CDI bean as stateless and you have problems. I'm packaging this as a war, and deploying to the JBoss 6 M2 released just yesterday with Weld 1.0.1 CR1. The stateless bean is being discovered as per the log but I get an NPE when I try to access it.
I exported a war file and ran it on Glassfish with no problems (build 74.2 - I think Weld 1.0).
I upgraded JBoss to use Weld 1.0.1 CR 2 and tried it again. The log confirms the weld version and the discovery of the bean :
INFO [org.jboss.ejb3.EJBContainer] STARTED EJB: org.cdiapp.MessageBean ejbName: MessageBean INFO [org.jboss.ejb3.proxy.impl.jndiregistrar.JndiSessionRegistrarBase] Binding the following Entries in Global JNDI: INFO [org.jboss.weld.Version] WELD-000900 1.0.1 (CR2) INFO [org.jboss.ejb3.nointerface.impl.jndi.AbstractNoInterfaceViewJNDIBinder] Binding the following entry in Global JNDI: MessageBean/no-interface - EJB3.1 no-interface view
Ran it again, and got a more helpful exception :
javax.servlet.ServletException: WELD-000079 Could not find the EJB in JNDI: class org.cdiapp.MessageBean_$$_javassist_63 javax.faces.webapp.FacesServlet.service(FacesServlet.java:325) org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:66) root cause org.jboss.weld.exceptions.CreationException: WELD-000079 Could not find the EJB in JNDI: class org.cdiapp.MessageBean_$$_javassist_63 org.jboss.weld.bean.SessionBean.create(SessionBean.java:313) org.jboss.weld.context.AbstractMapContext.get(AbstractMapContext.java:112) org.jboss.weld.bean.proxy.ClientProxyMethodHandler.getProxiedInstance(ClientProxyMethodHandler.java:142) org.jboss.weld.bean.proxy.ClientProxyMethodHandler.invoke(ClientProxyMethodHandler.java:99) org.jboss.weld.util.CleanableMethodHandler.invoke(CleanableMethodHandler.java:43) org.cdiapp.MessageBean_$$_javassist_69.getMessage(MessageBean_$$_javassist_69.java) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) javax.el.BeanELResolver.getValue(BeanELResolver.java:302) javax.el.CompositeELResolver.getValue(CompositeELResolver.java:175) com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72) org.apache.el.parser.AstValue.getValue(AstValue.java:134) org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:187) org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:71) com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:102) javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:190) javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:178) javax.faces.component.UIOutput.getValue(UIOutput.java:168) com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:205) com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:338) com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:164) javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878) javax.faces.component.UIComponent.encodeAll(UIComponent.java:1620) javax.faces.render.Renderer.encodeChildren(Renderer.java:168) javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848) javax.faces.component.UIComponent.encodeAll(UIComponent.java:1613) javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616) com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:380) com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126) javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:273) com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127) com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) javax.faces.webapp.FacesServlet.service(FacesServlet.java:313) org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:66) root cause java.lang.IllegalArgumentException: not a proxy instance java.lang.reflect.Proxy.getInvocationHandler(Proxy.java:637) org.jboss.weld.integration.ejb.JBossSessionObjectReference.<init>(JBossSessionObjectReference.java:44) org.jboss.weld.integration.ejb.JBossEjbServices.resolveEjb(JBossEjbServices.java:112) org.jboss.weld.bean.SessionBean.createReference(SessionBean.java:411) org.jboss.weld.bean.proxy.EnterpriseBeanProxyMethodHandler.<init>(EnterpriseBeanProxyMethodHandler.java:76) org.jboss.weld.bean.SessionBean.create(SessionBean.java:296) org.jboss.weld.context.AbstractMapContext.get(AbstractMapContext.java:112) org.jboss.weld.bean.proxy.ClientProxyMethodHandler.getProxiedInstance(ClientProxyMethodHandler.java:142) org.jboss.weld.bean.proxy.ClientProxyMethodHandler.invoke(ClientProxyMethodHandler.java:99) org.jboss.weld.util.CleanableMethodHandler.invoke(CleanableMethodHandler.java:43) org.cdiapp.MessageBean_$$_javassist_69.getMessage(MessageBean_$$_javassist_69.java) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) javax.el.BeanELResolver.getValue(BeanELResolver.java:302) javax.el.CompositeELResolver.getValue(CompositeELResolver.java:175) com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72) org.apache.el.parser.AstValue.getValue(AstValue.java:134) org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:187) org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:71) com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:102) javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:190) javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:178) javax.faces.component.UIOutput.getValue(UIOutput.java:168) com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:205) com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:338) com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:164) javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878) javax.faces.component.UIComponent.encodeAll(UIComponent.java:1620) javax.faces.render.Renderer.encodeChildren(Renderer.java:168) javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848) javax.faces.component.UIComponent.encodeAll(UIComponent.java:1613) javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616) com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:380) com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126) javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:273) com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127) com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) javax.faces.webapp.FacesServlet.service(FacesServlet.java:313) org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:66)
It seems JBoss 6 M2 lets you deploy EJBs in WAR files (YAY!) but I tried it with an Ear anyway and it still fails. It seems a little weird that the whole stateless bean would fail in weld in such a simple case, so I'm not sure I'm missing something. My app was built as an eclipse dynamic web project with JBoss Tools Nightly (and using their build drivers). I created the project and added the JSF and CDI facet and tweaked the generated faces-config.xml to use JSF 2.0 instead of the default 1.2. Again, it works fine as a non-ejb CDI bean. Changing it to be a Stateful also results in the same problem.
Cheers,
Andy