[ 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