2013-06-28 20 views
7

Tôi đang cố gắng sử dụng JSF/thẻ SelectManyCheckBox với một enum:

đây là mã xhtml của tôi:

  <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> 

Tôi đã thêm bộ chuyển đổi như được nêu trong một bài đăng khác.

Có vẻ như để làm việc tốt nhưng tôi thấy vết đống này trên 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) 

Sau stacktrace này, ứng dụng dường như làm việc tốt nhưng tôi tự hỏi tại sao lại có một stacktrace như vậy ..

Ai đó có thể giúp tôi không?

Cảm ơn.

Stéphane.

Trả lời

14

Điều này sẽ xảy ra khi UISelectMany thành phần value được cung cấp được tạo bằng phương thức Arrays#asList() thay vì new ArrayList().

Nếu mô hình value đã được chuẩn bị sẵn, JSF sẽ cố gắng sử dụng chính xác cùng loại để đặt giá trị đã gửi và đặt giá trị mô hình mới. Tuy nhiên, loại java.util.Arrays$ArrayList được trả lại bởi Arrays#asList() nằm trong số java.util.Arrays lớp và không thể được cá nhân hóa ngay lập tức như trong new Arrays$ArrayList(). Do đó ngoại lệ này.

Để khắc phục điều này, hãy đảm bảo rằng giá trị được tạo bằng cách sử dụng new ArrayList().

Cách khác, chỉ định rõ loại bộ sưu tập qua thuộc tính collectionType như được hướng dẫn trong câu trả lời liên quan chặt chẽ này: org.hibernate.LazyInitializationException at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValuesForModel.

<h:selectManyCheckbox ... collectionType="java.util.ArrayList"> 
Các vấn đề liên quan