Hi Trying some tests I have seen some differences between glassfish EL and tomcat alternative. I suppose the problem is in tomcat, but I haven't investigated too much about that. Sometimes tomcat's bundled EL can't found a method with parameters on the bean. My suggestions is check if there is a bug there.
Note the current behavior comply with the spec, so if it is not a but on tomcat's EL, what we can do in MyFaces is a hack to resolve this property as a developer could expect, but this should be disabled by default and I can't really imagine how this should work. It is curious getType() doesn't take advantage of java defined generics to extract the type in this part. Maybe by backward compatibility it returns Object.class, even if like in MYFACES-2552, the user expect other thing. regards, Leonardo Uribe 2011/12/6 Paul Nicolucci <[email protected]>: > > Hello All, > > I have tested MyFaces-2552 and everything seems to work correctly with > Composite Components in my testing however, I have an issue that I have > some concern about and wanted to get some feedback. > > After The following update to the EL: > https://issues.apache.org/bugzilla/show_bug.cgi?id=51177 (which is the > main reason for the fix in MyFaces-2552), I am having an issue using > <f:param/>. For example: > > Page1: > > <h:form id="form1" prependId="false"> > <h:outputScript name="jsf.js" library="javax.faces" > target="head" /> > > <h:commandButton id="button1" value="AddMessage" > action="#{elOperator.addFacesMessage}"/> > <br/> > <br/> > <h:link id="link1" outcome="ELMethodExpression2" value="Link with > Parameters"> > <f:param name="param1" value="param1"/> > <f:param name="param2" value="param2"/> > </h:link> > > <h:messages/> > </h:form> > > Navigates to Page2: > > Page2: > > <h:form id="form1" prependId="false"> > <h:outputScript name="jsf.js" library="javax.faces" > target="head" /> > > <!-- Test method expressions while passing parameters --> > <h:outputText id="out1" > value="#{elOperator.generateStringWithParameters > (param.param1,param.param2)}"/> > > </h:form> > > > Bean Method: > > public String generateStringWithParameters(String param1, String param2) { > return (param1 + ":" + param2); > } > > > When we try to call elOperator.generateStringWithParameters > (param.param1,param.param2) I'm getting the following exception: > > javax.faces.FacesException: java.lang.NoSuchMethodException: > com.ibm.ws.jsf.beans.ELOperatorBean.generateStringWithParameters > (java.lang.Object, java.lang.Object) > at > org.apache.myfaces.shared_impl.context.ExceptionHandlerImpl.wrap > (ExceptionHandlerImpl.java:241) > at > org.apache.myfaces.shared_impl.context.ExceptionHandlerImpl.handle > (ExceptionHandlerImpl.java:156) > at org.apache.myfaces.lifecycle.LifecycleImpl.render > (LifecycleImpl.java:258) > at javax.faces.webapp.FacesServlet.service > (FacesServlet.java:191) > at com.ibm.ws.webcontainer.servlet.ServletWrapper.service > (ServletWrapper.java:1188) > at > com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest > (ServletWrapper.java:763) > at > com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest > (ServletWrapper.java:454) > at > com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest > (ServletWrapperImpl.java:178) > at > com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters > (WebAppFilterManager.java:1020) > at > com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest > (CacheServletWrapper.java:87) > at com.ibm.ws.webcontainer.WebContainer.handleRequest > (WebContainer.java:895) > at com.ibm.ws.webcontainer.WSWebContainer.handleRequest > (WSWebContainer.java:1662) > at com.ibm.ws.webcontainer.channel.WCChannelLink.ready > (WCChannelLink.java:195) > at > com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination > (HttpInboundLink.java:452) > at > com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest > (HttpInboundLink.java:511) > at > com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest > (HttpInboundLink.java:305) > at > com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete > (HttpICLReadCallback.java:83) > at > com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted > (AioReadCompletionListener.java:165) > at com.ibm.io.async.AbstractAsyncFuture.invokeCallback > (AbstractAsyncFuture.java:217) > at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions > (AsyncChannelFuture.java:161) > at com.ibm.io.async.AsyncFuture.completed > (AsyncFuture.java:138) > at com.ibm.io.async.ResultHandler.complete > (ResultHandler.java:204) > at com.ibm.io.async.ResultHandler.runEventProcessingLoop > (ResultHandler.java:775) > at com.ibm.io.async.ResultHandler$2.run > (ResultHandler.java:905) > at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1659) > Caused by: java.lang.NoSuchMethodException: > com.ibm.ws.jsf.beans.ELOperatorBean.generateStringWithParameters > (java.lang.Object, java.lang.Object) > at java.lang.Class.throwNoSuchMethodException(Class.java:282) > at java.lang.Class.getMethod(Class.java:853) > at javax.el.BeanELResolver.invoke(BeanELResolver.java:406) > at javax.el.CompositeELResolver.invoke > (CompositeELResolver.java:137) > at org.apache.el.parser.AstValue.getValue(AstValue.java:159) > at org.apache.el.ValueExpressionImpl.getValue > (ValueExpressionImpl.java:283) > at > org.apache.myfaces.view.facelets.el.TagValueExpression.getValue > (TagValueExpression.java:85) > at javax.faces.component._DeltaStateHelper.eval > (_DeltaStateHelper.java:243) > at javax.faces.component.UIOutput.getValue(UIOutput.java:71) > at > org.apache.myfaces.shared_impl.renderkit.RendererUtils.getValue > (RendererUtils.java:343) > at > org.apache.myfaces.shared_impl.renderkit.RendererUtils.getStringValue > (RendererUtils.java:295) > at > org.apache.myfaces.shared_impl.renderkit.html.HtmlTextRendererBase.renderOutput > (HtmlTextRendererBase.java:92) > at > org.apache.myfaces.shared_impl.renderkit.html.HtmlTextRendererBase.encodeEnd > (HtmlTextRendererBase.java:79) > at javax.faces.component.UIComponentBase.encodeEnd > (UIComponentBase.java:519) > at javax.faces.component.UIComponent.encodeAll > (UIComponent.java:626) > at javax.faces.component.UIComponent.encodeAll > (UIComponent.java:622) > at javax.faces.component.UIComponent.encodeAll > (UIComponent.java:622) > at javax.faces.component.UIComponent.encodeAll > (UIComponent.java:622) > at > org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView > (FaceletViewDeclarationLanguage.java:1320) > at org.apache.myfaces.application.ViewHandlerImpl.renderView > (ViewHandlerImpl.java:263) > at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute > (RenderResponseExecutor.java:85) > at org.apache.myfaces.lifecycle.LifecycleImpl.render > (LifecycleImpl.java:239) > ... 22 more > > > Since the MapELResolver.java in the EL Implementation always returns > "Object.class" from getType() and the parameters are stored in the > RequestParameterMap we are now looking for a method signature using Object > instead of the expected type String. > > Has an issue already been opened for this? Suggestions on how to go about > fixing this? I've attached a simple test case that reproduces -> Navigate > to the ELMethodExpression.jsf page and then press the link -> the exception > appears. > > Thanks for the help! > > (See attached file: JSF20EL.war) > > Regards, > > Paul Nicolucci
