com.sun.faces.renderkit.html_basic.MenuRenderer createCollection:无法为类型java.util.Arrays创建新的Collection实例$ ArrayList [英] com.sun.faces.renderkit.html_basic.MenuRenderer createCollection: Unable to create new Collection instance for type java.util.Arrays$ArrayList
问题描述
我想使用带有枚举的JSF / SelectManyCheckBox标记:
I'm trying to use JSF / SelectManyCheckBox tag with an enum :
这是我的xhtml代码:
Here is my xhtml code :
<h:form id="searchForm">
<h:panelGrid columns="2">
<h:outputText value="Searched queues" />
<h:panelGroup>
<h:selectManyCheckbox layout="pageDirection" value="#{jmsErrorController.errorSearchCriteria.searchedQueues}" converter="queueConverter">
<f:selectItems value="#{jmsErrorController.completeQueueList}" />
</h:selectManyCheckbox>
</h:panelGroup>
</h:panelGrid>
<h:commandButton action="#{jmsErrorController.search}"
value="Search !" />
</h:form>
我已经在另一篇文章中添加了转换器。
I've add a converter as stated in an other post.
它似乎工作正常,但我看到这个堆栈跟踪在控制台:
It seems to work fine but I see this stack trace on the console :
28-Jun-2013 09:07:46 com.sun.faces.renderkit.html_basic.MenuRenderer createCollection
SEVERE: Unable to create new Collection instance for type java.util.Arrays$ArrayList
java.lang.InstantiationException: java.util.Arrays$ArrayList
at java.lang.Class.newInstance0(Class.java:340)
at java.lang.Class.newInstance(Class.java:308)
at com.sun.faces.renderkit.html_basic.MenuRenderer.createCollection(MenuRenderer.java:907)
at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValuesForModel(MenuRenderer.java:367)
at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValue(MenuRenderer.java:129)
at com.sun.faces.renderkit.html_basic.MenuRenderer.getConvertedValue(MenuRenderer.java:315)
at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1030)
at javax.faces.component.UIInput.validate(UIInput.java:960)
at javax.faces.component.UIInput.executeValidate(UIInput.java:1233)
at javax.faces.component.UIInput.processValidators(UIInput.java:698)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
at javax.faces.component.UIForm.processValidators(UIForm.java:253)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1172)
at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.doIt(WebAppServletContext.java:3684)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3650)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2268)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2174)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1446)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
在这个堆栈跟踪之后,工作正常,但我不知道为什么会有这样的stacktrace ..
After this stacktrace, the application seems to work fine but I wonder why is there such a stacktrace..
有人可以帮助我吗?
Stéphane。
推荐答案
$ c> UISelectMany 组件的值是使用
Arrays#asList()
method而不是 new ArrayList()
。
This will happen when the UISelectMany
component's value
being provided is created using Arrays#asList()
method instead of new ArrayList()
.
如果模型 value
已经预填充,JSF将尝试以使用完全相同的类型将提交的值放入并设置新的模型值。但是, Arrays#asList()
返回的 java.util.Arrays $ ArrayList
c $ c> java.util.Arrays 类,而不是如 new Array $ ArrayList()
中可单独实例化。因此这个异常。
If a model value
is already prepopulated, JSF will try to use exactly the same type to put submitted values in and set the new model value. However, the java.util.Arrays$ArrayList
type as returned by Arrays#asList()
is internal to java.util.Arrays
class and not individually instantiable as in new Arrays$ArrayList()
. Hence this exception.
要解决这个问题,请确保使用 new ArrayList()
创建该值。
To fix this, make sure that the value is created using new ArrayList()
.
或者,通过 collectionType
属性显式指定集合类型,如在这个紧密相关的答案中所指示的:org.hibernate.LazyInitializationException at com.sun.faces.renderkit.html_basic.MenuRenderer .convertSelectManyValuesForModel 。
Alternatively, explicitly specify the collection type via collectionType
attribute as instructed in this closely related answer: org.hibernate.LazyInitializationException at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValuesForModel.
<h:selectManyCheckbox ... collectionType="java.util.ArrayList">
这篇关于com.sun.faces.renderkit.html_basic.MenuRenderer createCollection:无法为类型java.util.Arrays创建新的Collection实例$ ArrayList的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!