2013-06-28 17 views
7

Próbuję użyć JSF/tag SelectManyCheckBox z ENUM:

Tutaj jest mój kod xhtml:

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

Dodałem konwerter, jak podano w innym poście.

Wydaje się działać prawidłowo, ale widzę ten ślad stosu na konsoli:

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) 

Po tym stacktrace, aplikacja wydaje się działać prawidłowo, ale zastanawiam się, dlaczego jest taki StackTrace ..

Czy ktoś może mi pomóc?

Dzięki.

Stéphane.

Odpowiedz

14

Stanie się to, gdy dostarczony komponent UISelectMany komponentu zostanie dostarczony przy użyciu metody Arrays#asList() zamiast new ArrayList().

Jeśli model value jest już wstępnie wypełniony, JSF spróbuje użyć dokładnie tego samego typu, aby wstawić przesłane wartości i ustawić nową wartość modelu. Jednak typ java.util.Arrays$ArrayList, który został zwrócony przez Arrays#asList(), jest wewnętrzny dla klasy java.util.Arrays i nie można go pojedynczo wprowadzać jak w przypadku new Arrays$ArrayList(). Stąd ten wyjątek.

Aby to naprawić, upewnij się, że wartość została utworzona za pomocą new ArrayList().

Ewentualnie jawnie określ typ kolekcji za pomocą atrybutu collectionType zgodnie z instrukcją w tej ściśle powiązanej odpowiedzi: org.hibernate.LazyInitializationException at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValuesForModel.

<h:selectManyCheckbox ... collectionType="java.util.ArrayList"> 
Powiązane problemy