2012-04-10 9 views
0

Vor einigen Tagen habe ich Mojarra zu MyFaces geändert, um this problem zu lösen, jetzt habe ich ein seltsames Problem beim Rendern meiner Composite-Komponenten, sie werden beim zweiten Öffnen einfach nicht gerendert ein Popup (das Popup ist auch eine zusammengesetzte Komponente). first openJSF 2.0 - MyFaces haben Probleme beim Rendern von CompositeKomponenten

dann ich, klicken Sie in „cancelar“ (Abbrechen) drücken, und das zweite Mal, keiner meiner Composite-Bauteile, ausgenommen:

Das erste Mal, als Sie in Fieldset sehen können, ist alles in Ordnung gemacht der Dialog wiedergegeben wird: second open

wenn ich log geschaut haben, fand ich diese Nachrichten:

[#|2012-04-10T15:22:00.681-0300|SEVERE|glassfish3.1.1|org.apache.myfaces.renderkit.html.HtmlCompositeComponentRenderer|_ThreadID=19;_ThreadName=Thread-2;|facet UIComponent.COMPOSITE_FACET_NAME not found when rendering composite component prevenda:popupPreVenda:j_id_2uz|#] 
[#|2012-04-10T15:22:00.684-0300|SEVERE|glassfish3.1.1|org.apache.myfaces.renderkit.html.HtmlCompositeComponentRenderer|_ThreadID=19;_ThreadName=Thread-2;|facet UIComponent.COMPOSITE_FACET_NAME not found when rendering composite component prevenda:popupPreVenda:inputRazaoSocial|#] 
[#|2012-04-10T15:22:00.685-0300|SEVERE|glassfish3.1.1|org.apache.myfaces.renderkit.html.HtmlCompositeComponentRenderer|_ThreadID=19;_ThreadName=Thread-2;|facet UIComponent.COMPOSITE_FACET_NAME not found when rendering composite component prevenda:popupPreVenda:j_id_2vi|#] 
[#|2012-04-10T15:22:00.685-0300|SEVERE|glassfish3.1.1|org.apache.myfaces.renderkit.html.HtmlCompositeComponentRenderer|_ThreadID=19;_ThreadName=Thread-2;|facet UIComponent.COMPOSITE_FACET_NAME not found when rendering composite component prevenda:popupPreVenda:j_id_2vn|#] 
[#|2012-04-10T15:22:00.686-0300|SEVERE|glassfish3.1.1|org.apache.myfaces.renderkit.html.HtmlCompositeComponentRenderer|_ThreadID=19;_ThreadName=Thread-2;|facet UIComponent.COMPOSITE_FACET_NAME not found when rendering composite component prevenda:popupPreVenda:j_id_2vs|#] 

wie Sie sehen können, ist das Problem, dass myfaces nicht eine Facette finden in Verbundbauteil ... Die einzige Verbundkomponente, die Facetten verwendet, ist hrgi:: Pop-up

<c:interface> 
    <c:attribute name="titulo" default="sem titulo" required="false"/> 
    <c:attribute name="renderizar" default="false" required="false"/> 
    <c:attribute name="modal" default="true" required="false"/> 
    <c:attribute name="bordaConteudo" default="true" required="false"/> 
    <c:facet name="cabecalho" required="false"/> 
    <c:facet name="conteudo" required="true"/> 
    <c:facet name="botoes" required="true"/> 
</c:interface> 

<c:implementation> 
<h:outputStylesheet library="css" name="hrgiPopup.css" target="head"/> 
<h:outputStylesheet library="css" name="clearfix.css" target="head"/> 
<h:outputScript library="js" name="hrgiPopup.js" target="head"/> 
<h:panelGroup layout="block" rendered="#{cc.attrs.renderizar}" 
       class="hrgi-dialog-panel clearfix"> 
    <h:panelGroup layout="block" class="hrgi-dialog-overlay clearfix" rendered="#{cc.attrs.modal}"></h:panelGroup> 
    <h:panelGroup id="popup" layout="block" class="hrgi-dialog-box clearfix"> 
     <h:panelGroup layout="block" class="hrgi-dialog-title clearfix"> 
      <h:outputText style="float:left" value="#{cc.attrs.titulo}"/> 
     </h:panelGroup> 
     <h:panelGroup layout="block" class="hrgi-dialog-content clearfix"> 
      <c:renderFacet name="cabecalho" required="false"/> 
      <h:panelGroup layout="block" class="hrgi-dialog-background clearfix" 
          rendered="#{cc.attrs.bordaConteudo}"> 
       <c:renderFacet name="conteudo" required="true"/> 
      </h:panelGroup> 
      <h:panelGroup layout="block" class="clearfix" rendered="#{not cc.attrs.bordaConteudo}"> 
       <c:renderFacet name="conteudo" required="true"/> 
      </h:panelGroup> 
      <c:renderFacet name="botoes" required="true"/> 
      <script type="text/javascript"> 
       cercarEventoTab("#{cc.clientId}:popup"); 
      </script> 
     </h:panelGroup> 
    </h:panelGroup> 
</h:panelGroup> 
</c:implementation> 

Ist das ein Fehler von MyFaces ?? Mojarra zeigt so kein Problem!

AKTUALISIERT

Das Problem tritt nur, wenn der Benutzer klickt "cancelar" Taste ... Die Aktion Aufruf dieser Code die Felder zu löschen und schließen Sie den Dialog:

public void cancelar(ActionEvent evento){ 
    fechar(); 
    UIComponent componente=evento.getComponent().getParent().getParent().getParent(); 
    componente.getFacet("conteudo").getChildren().clear(); 
} 

dieser Code angepasst wurde Von den Ansätzen können Sie here sehen. In diesem Fall werden nur Komponenten innerhalb des Facettenkontextes neu erstellt. Funktioniert gut, außer mit meinen Composite-Komponenten.

Antwort

0

Ich weiß nicht, warum, aber nachdem ich einige Klasse erstellt haben Ausnahmen zu behandeln, ist dieses Problem verschwunden ...

public class HRGIExceptionHandler extends ExceptionHandlerWrapper { 

    private ExceptionHandler wrapped; 

    public HRGIExceptionHandler(ExceptionHandler wrapped) { 
     this.wrapped = wrapped; 
    } 

    @Override 
    public ExceptionHandler getWrapped() { 
     return wrapped; 
    } 

    @Override 
    public void handle() throws FacesException { 
     Iterator i = getUnhandledExceptionQueuedEvents().iterator(); 
     while (i.hasNext()) { 
      ExceptionQueuedEvent event = (ExceptionQueuedEvent) i.next(); 
      ExceptionQueuedEventContext context = (ExceptionQueuedEventContext)event.getSource(); 
      Throwable t = context.getException(); 
      try{ 
       t.printStackTrace(); 
      }finally{ 
       i.remove(); 
      } 
     } 
     getWrapped().handle(); 
    } 
} 

und

public class HRGIExceptionHandlerFactory extends ExceptionHandlerFactory { 

    private ExceptionHandlerFactory parent; 

    public HRGIExceptionHandlerFactory(ExceptionHandlerFactory parent) { 
     this.parent = parent; 
    } 

    @Override 
    public ExceptionHandler getExceptionHandler() { 
     ExceptionHandler result = new HRGIExceptionHandler(parent.getExceptionHandler()); 
     return result; 
    } 
} 

schließlich habe ich hat dieses Bild faces.config:

<factory> 
    <exception-handler-factory>com.hrgi.web.erp.HRGIExceptionHandlerFactory</exception-handler-factory> 
</factory> 
0

Der Code in MyFaces ist in Ordnung. Das Protokoll suggest org.apache.myfaces.renderkit.html.HtmlCompositeComponentRenderer kann den Eintrag c: implementation in Ihrer zusammengesetzten Komponentendatei nicht finden. Seit 2.1.6 wurden einige Änderungen vorgenommen, um die Verwendung von '/' innerhalb von libraryName zu verhindern (Details siehe MYFACES-3454)). Ein web config param (org.apache.myfaces.STRICT_JSF_2_ALLOW_SLASH_LIBRARY_NAME) wurde hinzugefügt, um das Rückwärtsverhalten zu aktivieren, aber beachten Sie, dass das neue Verhalten explizit in der Spezifikation erwähnt wird.

Wenn das nicht funktioniert, erstellen Sie bitte eine einfache Demo-App, die den Fehler reproduziert und ein Problem in MyFaces Issue Tracker erstellt. Auf diese Weise gibt es bessere Chancen, dass es in einer zukünftigen Version gelöst werden könnte.

UPDATE

Ich versuchte es mit den ohne Erfolg zur Verfügung gestellten Informationen zu reproduzieren. Das Problem ist der Aufruf von

componente.getFacet("conteudo").getChildren().clear(); 

Dieser Code entfernt alle Komponenten innerhalb der Facette und MyFaces ist intelligent genug um die Komponenten zu erinnern, die entfernt wurde. Wenn die Ansicht wiederhergestellt wird, erstellt der MyFaces-Algorithmus die Ansicht wie in der ersten Anforderung und entfernt dann die Komponenten, um den Status ordnungsgemäß wiederherzustellen. Dieses Verhalten wird erwartet, daher gibt es keinen Fehler in MyFaces-Code. Ich nehme an, dass das vorher beschriebene Verhalten ein Fehler in Mojarra ist, und Sie sollten Ihren Code ändern, um Ihre Eingabe-Komponenten auf andere Weise zurückzusetzen, die Werte innerhalb der Bean zu löschen oder ein Methodenausdruck-Attribut in Ihrer Composite-Komponente zu erstellen aufgerufen, wenn der Abbruchvorgang auftritt und die erforderlichen Eingabefelder löschen. Es gibt viele Möglichkeiten, dies zu tun.

+0

die Web-Config nicht geholfen haben, verursachen möglicherweise die Erklärung Verbundbauteil Tag scheint nicht falsch zu sein: xmlns: hrgi = "ht tp: //java.sun.com/jsf/composite/hrgi ". Ich habe neue Informationen hinzugefügt. Vielen Dank für Ihre Aufmerksamkeit. – brevleq

+0

Ich habe "componente.getFacet (" conteudo ") angepasst. GetChildren(). Clear();" Von der zweiten Annäherung können Sie hier sehen: https://cwiki.apache.org/MYFACES/clear-input-components.html. Gibt es eine andere Möglichkeit, alle Komponenten der Seite ohne Probleme in meinen Composite-Komponenten zu löschen? – brevleq

Verwandte Themen