You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by "Keith Wong (Created) (JIRA)" <de...@myfaces.apache.org> on 2011/10/04 13:00:35 UTC

[jira] [Created] (MYFACES-3344) selectManyCheckbox State Saving

selectManyCheckbox State Saving 
--------------------------------

                 Key: MYFACES-3344
                 URL: https://issues.apache.org/jira/browse/MYFACES-3344
             Project: MyFaces Core
          Issue Type: Bug
          Components: General
    Affects Versions: 2.1.3
         Environment: Primefaces 3.0.RC1-SNAPSHOT, WebSphere 8.0
            Reporter: Keith Wong


Hi,

I have a problem when using p:selectManyCheckbox, as well as p:selectManyMenu, with MyFaces 2. Here is the page fragment:

	<p:inputTextarea value="#{customer.firstName}" required="true"/>

	<p:selectManyCheckbox value="#{customer.phones}">
		<f:selectItem itemValue="SS" itemLabel="Samsung"/>
		<f:selectItem itemValue="LG" itemLabel="LG"/>
		<f:selectItem itemValue="AP" itemLabel="Apple"/>
	</p:selectManyCheckbox>

	<p:commandButton value="Submit" process="@form" update="@form"/>

Steps to reproduce the problem:

1. Let the firstName field empty and click Submit
2. Type something in the firstName field and click Submit

Then, the following exception occurs, amendment to MyFaces is needed to capture the stack trace,

[2011/10/4   12:29:01:093 CST] 0000001d UIComponentBa W   类 javax/faces/component/UIComponentBase 非法访问 "private" 类 java/util/Arrays$ArrayList
                                 java.lang.IllegalAccessException: 类 javax/faces/component/UIComponentBase 非法访问 "private" 类 java/util/Arrays$ArrayList
	at java.lang.J9VMInternals.newInstanceImpl(Native Method)
	at java.lang.Class.newInstance(Class.java:1345)
	at javax.faces.component.UIComponentBase.restoreAttachedState(UIComponentBase.java:1717)
	at javax.faces.component._DeltaStateHelper.restoreState(_DeltaStateHelper.java:614)
	at javax.faces.component.UIComponentBase.restoreState(UIComponentBase.java:1885)
	at javax.faces.component.UIOutput.restoreState(UIOutput.java:213)
	at javax.faces.component.UIInput.restoreState(UIInput.java:1012)
	at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.restoreStateFromMap(DefaultFaceletsStateManagementStrategy.java:545)
	at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.restoreStateFromMap(DefaultFaceletsStateManagementStrategy.java:581)
	at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.restoreStateFromMap(DefaultFaceletsStateManagementStrategy.java:564)
	at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.restoreStateFromMap(DefaultFaceletsStateManagementStrategy.java:564)
	at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.restoreStateFromMap(DefaultFaceletsStateManagementStrategy.java:564)
	at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.restoreStateFromMap(DefaultFaceletsStateManagementStrategy.java:564)
	at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.restoreStateFromMap(DefaultFaceletsStateManagementStrategy.java:564)
	at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.restoreView(DefaultFaceletsStateManagementStrategy.java:241)
	at org.apache.myfaces.application.StateManagerImpl.restoreView(StateManagerImpl.java:113)
	at org.apache.myfaces.shared.view.ViewDeclarationLanguageBase.restoreView(ViewDeclarationLanguageBase.java:106)
	at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.restoreView(FaceletViewDeclarationLanguage.java:1832)
	at org.apache.myfaces.application.ViewHandlerImpl.restoreView(ViewHandlerImpl.java:296)
	at org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:123)
	at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:171)
	at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:189)
	at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1147)
	at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:722)
	at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:449)
	at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
	at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:125)
	at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:77)
	at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:919)
	at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1016)
	at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:87)
	at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:883)
	at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1659)
	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:1648)

After investigation, the cause could be in the saveAttachedState method of UIComponentBase.java:

        else if (attachedObject instanceof Collection)
        {
            if (ArrayList.class.equals(attachedObject.getClass()))
            {
                List<Object> lst = new ArrayList<Object>(((List<?>) attachedObject).size());

The above fragment only consider if the attachedObject is an instance of ArrayList.  However, the object returned from PrimeFaces is created by Arrays.asList, which is java.util.Arrays$ArrayList.  So, when performing restoreAttachedState, this private class could not be instantiated.  So, I suggest to change the line

            if (ArrayList.class.equals(attachedObject.getClass()))

as this

            if (ArrayList.class.equals(attachedObject.getClass()) || _ClassUtils.simpleClassForName("java.util.Arrays$ArrayList").equals(attachedObject.getClass()))

to solve the problem.


--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

       

[jira] [Commented] (MYFACES-3344) selectManyCheckbox State Saving

Posted by "Leonardo Uribe (Commented) (JIRA)" <de...@myfaces.apache.org>.
    [ https://issues.apache.org/jira/browse/MYFACES-3344?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13120385#comment-13120385 ] 

Leonardo Uribe commented on MYFACES-3344:
-----------------------------------------

I don't think this is a myfaces bug. If the passed instance is not serializable or doesn't implement StateHolder interface, the code will throw an error. It is not a good idea to check for a class that is an internal detail. The code in primefaces should be fixed instead. I'll close this one as invalid. Thanks for report this one.
                
> selectManyCheckbox State Saving 
> --------------------------------
>
>                 Key: MYFACES-3344
>                 URL: https://issues.apache.org/jira/browse/MYFACES-3344
>             Project: MyFaces Core
>          Issue Type: Bug
>          Components: General
>    Affects Versions: 2.1.3
>         Environment: Primefaces 3.0.RC1-SNAPSHOT, WebSphere 8.0
>            Reporter: Keith Wong
>
> Hi,
> I have a problem when using p:selectManyCheckbox, as well as p:selectManyMenu, with MyFaces 2. Here is the page fragment:
> 	<p:inputTextarea value="#{customer.firstName}" required="true"/>
> 	<p:selectManyCheckbox value="#{customer.phones}">
> 		<f:selectItem itemValue="SS" itemLabel="Samsung"/>
> 		<f:selectItem itemValue="LG" itemLabel="LG"/>
> 		<f:selectItem itemValue="AP" itemLabel="Apple"/>
> 	</p:selectManyCheckbox>
> 	<p:commandButton value="Submit" process="@form" update="@form"/>
> Steps to reproduce the problem:
> 1. Let the firstName field empty and click Submit
> 2. Type something in the firstName field and click Submit
> Then, the following exception occurs, amendment to MyFaces is needed to capture the stack trace,
> [2011/10/4   12:29:01:093 CST] 0000001d UIComponentBa W   类 javax/faces/component/UIComponentBase 非法访问 "private" 类 java/util/Arrays$ArrayList
>                                  java.lang.IllegalAccessException: 类 javax/faces/component/UIComponentBase 非法访问 "private" 类 java/util/Arrays$ArrayList
> 	at java.lang.J9VMInternals.newInstanceImpl(Native Method)
> 	at java.lang.Class.newInstance(Class.java:1345)
> 	at javax.faces.component.UIComponentBase.restoreAttachedState(UIComponentBase.java:1717)
> 	at javax.faces.component._DeltaStateHelper.restoreState(_DeltaStateHelper.java:614)
> 	at javax.faces.component.UIComponentBase.restoreState(UIComponentBase.java:1885)
> 	at javax.faces.component.UIOutput.restoreState(UIOutput.java:213)
> 	at javax.faces.component.UIInput.restoreState(UIInput.java:1012)
> 	at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.restoreStateFromMap(DefaultFaceletsStateManagementStrategy.java:545)
> 	at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.restoreStateFromMap(DefaultFaceletsStateManagementStrategy.java:581)
> 	at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.restoreStateFromMap(DefaultFaceletsStateManagementStrategy.java:564)
> 	at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.restoreStateFromMap(DefaultFaceletsStateManagementStrategy.java:564)
> 	at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.restoreStateFromMap(DefaultFaceletsStateManagementStrategy.java:564)
> 	at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.restoreStateFromMap(DefaultFaceletsStateManagementStrategy.java:564)
> 	at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.restoreStateFromMap(DefaultFaceletsStateManagementStrategy.java:564)
> 	at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.restoreView(DefaultFaceletsStateManagementStrategy.java:241)
> 	at org.apache.myfaces.application.StateManagerImpl.restoreView(StateManagerImpl.java:113)
> 	at org.apache.myfaces.shared.view.ViewDeclarationLanguageBase.restoreView(ViewDeclarationLanguageBase.java:106)
> 	at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.restoreView(FaceletViewDeclarationLanguage.java:1832)
> 	at org.apache.myfaces.application.ViewHandlerImpl.restoreView(ViewHandlerImpl.java:296)
> 	at org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:123)
> 	at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:171)
> 	at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
> 	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:189)
> 	at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1147)
> 	at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:722)
> 	at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:449)
> 	at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
> 	at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:125)
> 	at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:77)
> 	at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:919)
> 	at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1016)
> 	at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:87)
> 	at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:883)
> 	at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1659)
> 	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:1648)
> After investigation, the cause could be in the saveAttachedState method of UIComponentBase.java:
>         else if (attachedObject instanceof Collection)
>         {
>             if (ArrayList.class.equals(attachedObject.getClass()))
>             {
>                 List<Object> lst = new ArrayList<Object>(((List<?>) attachedObject).size());
> The above fragment only consider if the attachedObject is an instance of ArrayList.  However, the object returned from PrimeFaces is created by Arrays.asList, which is java.util.Arrays$ArrayList.  So, when performing restoreAttachedState, this private class could not be instantiated.  So, I suggest to change the line
>             if (ArrayList.class.equals(attachedObject.getClass()))
> as this
>             if (ArrayList.class.equals(attachedObject.getClass()) || _ClassUtils.simpleClassForName("java.util.Arrays$ArrayList").equals(attachedObject.getClass()))
> to solve the problem.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira