2015-05-15 60 views
2

我嘗試使用o:validateOrder驗證rich:calendar組件時出現問題。錯誤Omnifaces o:validateOrder與豐富的面部日曆組件

代碼:

<!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:a4j="http://richfaces.org/a4j" 
    xmlns:rich="http://richfaces.org/rich" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:c="http://java.sun.com/jsp/jstl/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:tablas="http://java.sun.com/jsf/composite/tablas" 
    xmlns:o="http://omnifaces.org/ui" 
    xmlns:of="http://omnifaces.org/functions" 
    xmlns:templates="http://java.sun.com/jsf/composite/templates" 
    > 

<body> 

    <f:metadata> 
     <f:event type="preRenderView" listener="#{baseController.iniciarConversacion()}" /> 
    </f:metadata> 

    <ui:composition template="/templates/TemplateABM.xhtml"> 
     <ui:define name="title"> 
       #{msgs['facturacion.abm.generacion.factura.individual.pagina.titulo']} 
      </ui:define> 
     <ui:define name="top"> 
      <h1>#{msgs['facturacion.abm.generacion.factura.individual.titulo']}</h1> 
     </ui:define> 
     <ui:define name="content"> 

      <h:form id="formFacturaIndividual"> 


       <h:panelGroup id="panelFechas"> 
        <h:inputHidden id="fechaInicioFactura" value="#{facturaController.fechaInicioFactura}"> 
         <f:convertDateTime type="date" pattern="dd/MM/yy"/> 
        </h:inputHidden> 

        <h:inputHidden id="fechaFinFactura" value="#{facturaController.fechaFinFactura}"> 
         <f:convertDateTime type="date" pattern="dd/MM/yy"/> 
        </h:inputHidden>    

        <h:inputHidden id="fechaEmisionComprobanteUltima" value="#{comprobanteController.fechaEmisionComprobanteUltima}"> 
         <f:convertDateTime type="date" pattern="dd/MM/yy"/> 
        </h:inputHidden>    
       </h:panelGroup> 

       <o:validateOrder id="validacionFechaFacturaMenorAFechaInicioFactura" type="gte" components="fechaFactura fechaInicioFactura" 
       message="#{msgs['comun.abm.fecha.factura.menor.limite.dia']}" showMessageFor="fechaFactura" /> 
       <o:validateOrder id="validacionFechaFacturaMayorAFechaFinFactura" type="lte" components="fechaFactura fechaFinFactura" 
       message="#{msgs['comun.abm.fecha.factura.menor.limite.dia']}" showMessageFor="fechaFactura" />        
       <o:validateOrder id="validacionFechaFacturaMayorAFechaEmisionUltimoComprobante" type="gte" components="fechaFactura fechaEmisionComprobanteUltima" 
       message="#{of:format1(msgs['comun.abm.fecha.factura.menor.ultimo.comprobante'], comprobanteController.fechaEmisionComprobanteUltima)}" showMessageFor="fechaFactura" /> 

       <o:massAttribute name="disabled" value="#{tipoComprobanteController.entidad == null}"> 
        <rich:panel id="panelDatosFactura" header="#{msgs['facturacion.abm.generacion.padron.panel.datos.factura']}"> 

         <h:panelGrid id="DatosFactura" columns="3"> 

          <h:outputLabel value="#{msgs['facturacion.abm.generacion.padron.fecha.factura']}" for="fechaFactura"/> 
          <rich:calendar 
           id="fechaFactura" 
           datePattern="dd/MM/yyyy" 
           showWeeksBar="false" 
           enableManualInput="true" 
           value="#{generacionFacturacionIndividualController.facturaBean.fechaFactura}" 
           required="true" 
           requiredMessage="La Fecha de la Factura es Obligatoria" > 
    <a4j:ajax event="change" execute="@form" /> 
          </rich:calendar> 
          <h:panelGroup> 
           <rich:message for="fechaFactura"/> 
          </h:panelGroup> 

         </h:panelGrid> 

        </rich:panel> 
       </o:massAttribute> 


      </h:form> 

     </ui:define> 
    </ui:composition> 

</body> 
</html> 

例外:

java.lang.IllegalArgumentException: All values must implement java.lang.Comparable. 
    at org.omnifaces.component.validator.ValidateOrder.validateValues(ValidateOrder.java:142) 
    at org.omnifaces.component.validator.ValidateMultipleFields.validateComponents(ValidateMultipleFields.java:213) 
    at org.omnifaces.component.validator.ValidatorFamily.processValidators(ValidatorFamily.java:63) 
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1216) 
    at javax.faces.component.UIForm.processValidators(UIForm.java:253) 
    at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:536) 
    at org.richfaces.context.MetaComponentProcessingVisitCallback.visit(MetaComponentProcessingVisitCallback.java:73) 
    at org.richfaces.context.BaseExtendedVisitContext.invokeVisitCallback(BaseExtendedVisitContext.java:103) 
    at org.richfaces.context.ExtendedExecuteVisitContext.invokeVisitCallback(ExtendedExecuteVisitContext.java:55) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1652) 
    at javax.faces.component.UIForm.visitTree(UIForm.java:371) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1663) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1663) 
    at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:383) 
    at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:257) 
    at org.richfaces.context.ExtendedPartialViewContext.processPartial(ExtendedPartialViewContext.java:263) 
    at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:183) 
    at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1162) 
    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 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at ar.com.filter.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:35) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.ClassCastException: java.util.Date cannot be cast to java.lang.String 
    at java.lang.String.compareTo(String.java:108) 
    at java.util.Collections$ReverseComparator.compare(Collections.java:3578) 
    at java.util.Collections$ReverseComparator.compare(Collections.java:3569) 
    at java.util.TimSort.countRunAndMakeAscending(TimSort.java:324) 
    at java.util.TimSort.sort(TimSort.java:189) 
    at java.util.TimSort.sort(TimSort.java:173) 
    at java.util.Arrays.sort(Arrays.java:659) 
    at java.util.Collections.sort(Collections.java:217) 
    at org.omnifaces.component.validator.ValidateOrder$Type$4.invoke(ValidateOrder.java:99) 
    at org.omnifaces.component.validator.ValidateOrder$Type$4.invoke(ValidateOrder.java:95) 
    at org.omnifaces.component.validator.ValidateOrder$Type.validateOrder(ValidateOrder.java:111) 
    at org.omnifaces.component.validator.ValidateOrder.validateValues(ValidateOrder.java:139) 
    ... 44 more 

我debuged代碼和問題是豐富的:日曆組件發送字符串,而不是日期類型,這種情況不會發生在我的其他我不知道的網頁是omnifaces問題或richfaces。有任何想法嗎?

+0

我修正了把o:validateOrder放在文件的末尾。 –

回答

1

<o:validateXxx>組件對其相對於目標輸入組件的位置敏感。根據組件自己的轉換器和驗證器,這對於優先驗證非常有用。

當前目標輸入部件放置,那麼他們將驗證原始的未提交值,它們將組件自己的驗證的任何之前運行

當放置目標輸入組件,那麼他們將驗證所轉換的值(如果有轉換器是參與),並且他們將組件自己的驗證器的任何運行後

在您的具體情況下,您將<o:validateOrder>置於之間的那些組件。這不是推薦的方法。您將最終得到List填充Date實例來自驗證程序上方的組件和String實例來自驗證程序下方的組件。

參見the ValidateMultipleFields javadoc(重點煤礦):

這個驗證可以放在任何地方的形式,但要記住,該組件將在順序出現在表單進行驗證。所以如果這個驗證器被放置在所有組件之前,那麼它將在任何組件自己的驗證器之前被執行。如果此驗證程序失敗,那麼該組件自己的驗證程序將不會被觸發。如果這個驗證器放置在所有組件之後,那麼它將在任何組件自己的驗證器之後執行。如果其中任何一個失敗,那麼這個驗證器將不會被執行。 不建議將此驗證程序置於引用組件之間的某處,因爲結果行爲可能會造成混淆。將此驗證程序放在所有組件之前或之後,具體取決於您希望優先驗證的方式。

+0

很好的解釋謝謝。 –

+0

不客氣。 – BalusC