[ 
https://issues.apache.org/jira/browse/MYFACES-1819?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12569137#action_12569137
 ] 

Leonardo Uribe commented on MYFACES-1819:
-----------------------------------------

I have found on the doc of ValueExpression the following:

"........The getValue(javax.el.ELContext), setValue(javax.el.ELContext, 
java.lang.Object), isReadOnly(javax.el.ELContext) and 
getType(javax.el.ELContext) methods will evaluate the expression each time they 
are called......"

So, there is not side effects on changing getType by getValue 

(only for methods related to SelectUIMany

RendererUtils. findUISelectManyConverter
_SharedRendererUtils.getConvertedUISelectManyValue
)

> h:selectManyCheckbox with value="#{bean.map['somekey']}" fails  
> ----------------------------------------------------------------
>
>                 Key: MYFACES-1819
>                 URL: https://issues.apache.org/jira/browse/MYFACES-1819
>             Project: MyFaces Core
>          Issue Type: Bug
>         Environment: tomcat 6, windows xp
>            Reporter: Leonardo Uribe
>
> On jsf 1.1, code like this (taken from tomahawk examples 
> displayValueOnly.jsp):
> bean:
> public class DVOFace implements Serializable
> {
>     /**
>      * serial id for serialisation versioning
>      */
>     private static final long serialVersionUID = 1L;
>     private boolean attribute = true;
>     
>     private Map map = new HashMap(){
>         /**
>          * serial id for serialisation versioning
>          */
>         private static final long serialVersionUID = 1L;
>         public Object get(Object key){
>               Object held = super.get( key );
>               if( held != null )
>                       return held;
>               if( key.toString().toLowerCase().indexOf("list")>0 )
>                       return new ArrayList();
>               
>               return null;    
>       }
>     };
>       public boolean isAttribute() {
>               return attribute;
>       }
>       public void setAttribute(boolean attribute) {
>               this.attribute = attribute;
>       }
>       public Map getMap() {
>               return map;
>       }
>       public void setMap(Map map) {
>               this.map = map;
>       }
> }
> page:
>               <h:selectManyCheckbox id="selectManyCheckbox" 
> value="#{dvoFace.map['selectManyCheckboxList']}"
>                               <f:selectItem itemLabel="Value 1" 
> itemValue="1"/>
>                               <f:selectItem itemLabel="Value 2" 
> itemValue="2"/>
>                               <f:selectItem itemLabel="Value 3" 
> itemValue="3"/>
>               </h:selectManyCheckbox>
> throws the following exception:
> javax.faces.FacesException: Exception while calling encodeEnd on component : 
> {Component-Path : [Class: javax.faces.component.UIViewRoot,ViewId: 
> /displayValueOnly.jsp][Class: javax.faces.component.html.HtmlForm,Id: 
> form][Class: javax.faces.component.html.HtmlPanelGrid,Id: firstGrid]}
>       at 
> javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:559)
>       at javax.faces.component.UIComponent.encodeAll(UIComponent.java:250)
>       at javax.faces.component.UIComponent.encodeAll(UIComponent.java:246)
>       at javax.faces.component.UIComponent.encodeAll(UIComponent.java:246)
>       at 
> org.apache.myfaces.application.jsp.JspViewHandlerImpl.actuallyRenderView(JspViewHandlerImpl.java:423)
>       at 
> org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:380)
>       at 
> org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:41)
>       at 
> org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:140)
>       at javax.faces.webapp.FacesServlet.service(FacesServlet.java:152)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>       at 
> org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:147)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>       at 
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
>       at 
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
>       at 
> org.apache.catalina.valves.RequestFilterValve.process(RequestFilterValve.java:269)
>       at 
> org.apache.catalina.valves.RemoteAddrValve.invoke(RemoteAddrValve.java:81)
>       at 
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
>       at 
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
>       at 
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
>       at 
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
>       at 
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
>       at 
> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
>       at 
> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
>       at java.lang.Thread.run(Thread.java:619)
> Caused by: javax.faces.FacesException: Exception while calling encodeEnd on 
> component : {Component-Path : [Class: 
> javax.faces.component.UIViewRoot,ViewId: /displayValueOnly.jsp][Class: 
> javax.faces.component.html.HtmlForm,Id: form][Class: 
> javax.faces.component.html.HtmlPanelGrid,Id: firstGrid][Class: 
> javax.faces.component.html.HtmlSelectManyCheckbox,Id: selectManyCheckbox]}
>       at 
> javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:559)
>       at 
> org.apache.myfaces.shared_impl.renderkit.RendererUtils.renderChild(RendererUtils.java:515)
>       at 
> org.apache.myfaces.shared_impl.renderkit.html.HtmlGridRendererBase.renderChildren(HtmlGridRendererBase.java:231)
>       at 
> org.apache.myfaces.shared_impl.renderkit.html.HtmlGridRendererBase.encodeEnd(HtmlGridRendererBase.java:102)
>       at 
> javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:556)
>       ... 25 more
> Caused by: java.lang.IllegalArgumentException: ValueBinding for UISelectMany 
> : {Component-Path : [Class: javax.faces.component.UIViewRoot,ViewId: 
> /displayValueOnly.jsp][Class: javax.faces.component.html.HtmlForm,Id: 
> form][Class: javax.faces.component.html.HtmlPanelGrid,Id: firstGrid][Class: 
> javax.faces.component.html.HtmlSelectManyCheckbox,Id: selectManyCheckbox]} 
> must be of type List or Array
>       at 
> org.apache.myfaces.shared_impl.renderkit.RendererUtils.findUISelectManyConverter(RendererUtils.java:448)
>       at 
> org.apache.myfaces.shared_impl.renderkit.html.HtmlCheckboxRendererBase.renderCheckboxList(HtmlCheckboxRendererBase.java:100)
>       at 
> org.apache.myfaces.shared_impl.renderkit.html.HtmlCheckboxRendererBase.encodeEnd(HtmlCheckboxRendererBase.java:65)
>       at 
> javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:556)
>       ... 29 more
> Since in 1.1 this works, we have to make this works on 1.2 too 
> The problem is in two classes:
> org.apache.myfaces.shared.renderkit.RendererUtils
> and
> org.apache.myfaces.shared.renderkit._SharedRendererUtils
> and
> javax.faces.component._SharedRendererUtils
> The following code (repeated on several situations):
>         ValueExpression expression = component.getValueExpression("value");
>         if (expression == null) return null;
>         Class valueType = expression.getType(facesContext.getELContext());
> expression.getType(facesContext.getELContext()) does not return the real 
> value class. The doc says this:
> "........Evaluates the expression relative to the provided context, and 
> returns the most general type that is acceptable for an object to be passed 
> as the value parameter in a future call to the setValue(javax.el.ELContext, 
> java.lang.Object) method......."
> In the case it returns java.lang.Object, but it should be ArrayList. So is 
> preferred to do something like this:
>             Object value = expression.getValue(facesContext.getELContext()); 
>             valueType = (value != null) ? value.getClass() :
>                 expression.getType(facesContext.getELContext()) ;

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to