2013-12-13 79 views
1

我的XHTML頁面:java.lang.IllegalArgumentException異常:發行管理

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:c="http://java.sun.com/jstl/core" 
     > 
    <h:head> 
     <!-- <h:outputStylesheet library="css" name="table-style.css" /> --> 
    </h:head> 

    <h:body> 

     <h1>category</h1> 
     <h:form id="form"> 
      <h:panelGrid columns="1"> 
       <c:forEach items="#{categoryBean.parentCategoryList}" var="cat"> 
        <h:panelGroup> 
         <h:outputText value="#{cat.name}"/> 
         <h:commandButton value="+" type="button" onclick="expand('#{cat.name}');"/> 
        </h:panelGroup> 
        <h:panelGroup> 
         <h:selectManyCheckbox id="#{cat.name}" style="display: none" value="#{categoryBean.selectedCategoryList}"> 
          <f:selectItems value="#{categoryBean.getSubCategoryList(cat.id)}" var="sub" itemLabel="#{sub.name}" itemValue="#{sub.name}"/> 
         </h:selectManyCheckbox> 
        </h:panelGroup> 
       </c:forEach> 
      </h:panelGrid> 
      <h:commandButton value="Submit" action="result" /> 
      <h:commandButton value="Reset" type="reset" /> 
     </h:form> 

     <script type="text/javascript"> 
      function expand(cat) { 
       var name = "form:" + cat; 
       alert(name); 
       var element = document.getElementById(name); 
       if(element.style.display == 'block') { 
        element.value = "-"; 
        element.style.display = 'none'; 
       } else { 
        element.value = "+"; 
        element.style.display = 'block' 
       } 
      } 
     </script> 
    </h:body> 
</html> 

我的託管bean

package com.gtp.iqp.presentation.managedBeans; 

import java.util.ArrayList; 
import java.util.List; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 

import com.gtp.iqp.business.bo.Category; 
import com.gtp.iqp.business.delegate.CategoryDelegate; 

@SuppressWarnings("serial") 
@Component 
public class CategoryBean extends BaseManagedBean { 

    @Autowired 
    private CategoryDelegate categoryDelegate; 
    private List<Category> parentCategoryList; 
    private List<String>  selectedCategoryList; 

    public CategoryDelegate getCategoryDelegate() { 
     return categoryDelegate; 
    } 
    public void setCategoryDelegate(CategoryDelegate categoryDelegate) { 
     this.categoryDelegate = categoryDelegate; 
    } 
    public List<Category> getParentCategoryList() { 
     parentCategoryList = categoryDelegate.getParentCategories(); 
     return parentCategoryList; 
    } 
    public void setParentCategoryList(List<Category> parentCategoryList) { 
     this.parentCategoryList = parentCategoryList; 
    } 
    public List<String> getSelectedCategoryList() { 
     return selectedCategoryList; 
    } 
    public void setSelectedCategoryList(List<String> selectedCategoryList) { 
     this.selectedCategoryList = selectedCategoryList; 
    } 
    public List<Category> getSubCategoryList(long parent) { 
     return categoryDelegate.getSubCategories(parent); 
    } 

} 

我的問題

<f:selectItems value="#{categoryBean.getSubCategoryList(cat.id)}"/> 

上面的selectItems語句能夠從數據庫中獲取列表。我能夠看到託管bean包含列表。但是,一旦控件轉移到xhtml頁面,它就不會顯示。我看到以下例外情況:

Hibernate: select this_.id as id1_1_0_, this_.name as name2_1_0_, this_.parent as parent3_1_0_ from category this_ where this_.parent=? 
Hibernate: select this_.id as id1_1_0_, this_.name as name2_1_0_, this_.parent as parent3_1_0_ from category this_ where this_.parent=? 
Hibernate: select this_.id as id1_1_0_, this_.name as name2_1_0_, this_.parent as parent3_1_0_ from category this_ where this_.parent=? 
Dec 13, 2013 2:56:06 PM com.sun.faces.context.ExceptionHandlerImpl log 
FATAL: JSF1073: java.lang.IllegalArgumentException caught during processing of RENDER_RESPONSE 6 : UIComponent-ClientId=, Message=Release Management 
Dec 13, 2013 2:56:06 PM com.sun.faces.context.ExceptionHandlerImpl log 
FATAL: Release Management 
java.lang.IllegalArgumentException: Release Management 
    at javax.faces.component.UIComponentBase.validateId(UIComponentBase.java:592) 
    at javax.faces.component.UIComponentBase.setId(UIComponentBase.java:412) 
    at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.assignUniqueId(ComponentTagHandlerDelegateImpl.java:373) 
    at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:176) 
    at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
    at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
    at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:190) 
    at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
    at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95) 
    at com.sun.faces.facelets.tag.jstl.core.ForEachHandler.apply(ForEachHandler.java:230) 
    at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
    at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:190) 
    at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
    at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95) 
    at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
    at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:190) 
    at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
    at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95) 
    at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
    at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:190) 
    at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
    at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95) 
    at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93) 
    at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:87) 
    at com.sun.faces.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:161) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:980) 
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:99) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

有人可以告訴我我做錯了什麼,我該如何解決它?

回答

3

看看堆棧跟蹤的頂部線條的類/方法名密切,良好的圖書館有相當自我解釋類/方法名:

java.lang.IllegalArgumentException: Release Management 
    at javax.faces.component.UIComponentBase.validateId(UIComponentBase.java:592) 
    at javax.faces.component.UIComponentBase.setId(UIComponentBase.java:412) 

因此,設置的id期間發生一個UI組件。該ID正在驗證中,不被視爲有效。事實上,Release Management具有的空間內,其是作爲每javadoc無效:

設置此UIComponent的組件標識符(如果有的話)。組件標識符必須遵守以下語法限制:

  • 不得爲零長度字符串。
  • 第一個字符必須是字母或下劃線('_')。
  • 後續字符必須是字母,數字,下劃線('_')或短劃線(' - ')。

空間中的HTML元素的ID是順便還根據HTML spec無效(你知道,JSF基本上是一個HTML代碼生成器,當然應該尊重HTML規範):

ID和名稱標記必須以字母([A-Za-z])開頭,後面可以跟隨任意數量的字母,數字([0-9]),連字符(「 - 」),下劃線(「_」) ,冒號(「:」)和句點(「。」)。

罪魁禍首是在這裏:

<h:selectManyCheckbox id="#{cat.name}" ...> 

在這種特殊情況下,你已經基本上採用兩種方法來解決這個問題:

  1. 使用<h:dataTable>而不是<h:panelGrid><c:forEach>,它會接收以索引爲前綴的自動生成的ID:

    <h:dataTable value="#{categoryBean.parentCategoryList}" var="cat"> 
        <h:column> 
         <h:outputText value="#{cat.name}"/> 
         <h:commandButton value="+" type="button" onclick="expand('#{cat.name}');"/> 
         <br/> 
         <h:selectManyCheckbox id="name" style="display: none" value="#{categoryBean.selectedCategoryList}"> 
          <f:selectItems value="#{categoryBean.getSubCategoryList(cat.id)}" var="sub" itemLabel="#{sub.name}" itemValue="#{sub.name}"/> 
         </h:selectManyCheckbox> 
        </h:column> 
    </h:dataTable> 
    
  2. <c:forEach varStatus>使用固定前綴與增量數字後綴:

    <h:panelGrid columns="1"> 
        <c:forEach items="#{categoryBean.parentCategoryList}" var="cat" varStatus="loop"> 
         <h:panelGroup> 
          <h:outputText value="#{cat.name}"/> 
          <h:commandButton value="+" type="button" onclick="expand('#{cat.name}');"/> 
         </h:panelGroup> 
         <h:panelGroup> 
          <h:selectManyCheckbox id="name_#{loop.index}" style="display: none" value="#{categoryBean.selectedCategoryList}"> 
           <f:selectItems value="#{categoryBean.getSubCategoryList(cat.id)}" var="sub" itemLabel="#{sub.name}" itemValue="#{sub.name}"/> 
          </h:selectManyCheckbox> 
         </h:panelGroup> 
        </c:forEach> 
    </h:panelGrid> 
    

不要忘了相應地改變expand() JS函數的參數,如果需要的話。

+0

非常感謝。 – SerotoninChase

相關問題