2012-04-10 1 views
0

Несколько дней назад я изменил mojarra на myfaces, чтобы решить this problem, теперь у меня возникла странная проблема с рендерингом моих составных компонентов, они просто не отображаются во второй раз, когда я открываю одно всплывающее окно (всплывающее окно также является составным компонентом).JSF 2.0 - У моих поверхностей проблемы с отображением составных компонентов

В первый раз, как вы можете видеть в FIELDSET, все оказывается в порядке: first open

затем я нажимаю на «CANCELAR» (отменить) кнопку, а второй раз, ни один из моих составных компонентов, за исключением диалог, визуализируется: second open

, когда я смотрел на бревне, я нашел эти сообщения:

[#|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|#] 

как вы можете видеть, проблема в том, что MyFaces не может найти грань в композитном компоненте ... Единственный составной компонент, который использует фасетов hrgi: всплывающее окно:

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

Является ли это ошибка в MyFaces ?? Моджарра не вызывает никаких проблем!

ОБНОВЛЕНО

Проблема только происходит, когда пользователь нажимает кнопку «CANCELAR» ... Действие называют этот код, чтобы очистить поля и закрыть диалоговое окно:

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

этот код был адаптирован из подходов вы можете видеть here. В этом случае воссоздаются только компоненты внутри фасета conteudo. Работает отлично, за исключением моих составных компонентов.

ответ

0

Я не знаю, почему, но после того, как я создал некоторый класс для обработки исключений, эта проблема исчезла ...

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(); 
    } 
} 

и

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

наконец я добавил это to faces.config:

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

Код в MyFaces в порядке. В журнале предлагается, что org.apache.myfaces.renderkit.html.HtmlCompositeComponentRenderer не может найти запись c: implementation в вашем составном файле компонента. Начиная с версии 2.1.6 некоторые изменения были сделаны для предотвращения использования символов '/' внутри libraryName (см. MYFACES-3454 для получения более подробной информации). Параметр веб-конфигурации (org.apache.myfaces.STRICT_JSF_2_ALLOW_SLASH_LIBRARY_NAME) был добавлен, чтобы включить обратное поведение, но обратите внимание, что новое поведение упоминается явным образом внутри спецификации.

Если это не сработает, попробуйте создать простое демонстрационное приложение, воспроизводящее ошибку, и создайте проблему в MyFaces Issue Tracker. Таким образом, есть лучшие шансы на то, что его можно будет решить в будущей версии.

UPDATE

Я попытался воспроизвести его с информацией, предоставленной без успеха. Проблема в том, вызов

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

Этот код удалить все компоненты внутри фасета и MyFaces умна прийти вспомнить те компоненты, которые были удалены. Когда представление восстанавливается, алгоритм MyFaces создает представление как в первом запросе, а затем удаляет компоненты для правильного восстановления состояния. Такое поведение ожидается, поэтому в коде MyFaces нет ошибки. Вместо этого я предполагаю, что описанное выше поведение является ошибкой в ​​Mojarra, и вы должны изменить свой код, чтобы сбросить свои исходные компоненты другим способом, возможно, очистить значения внутри компонента или создать атрибут выражения метода в составном компоненте, который может быть вызывается при отмене операции и очистке необходимых полей ввода. Существует много способов сделать это.

+0

Веб-конфигуратор не помог, возможно, причина, по которой объявление тега составного компонента не выглядит неправильным: xmlns: hrgi = "ht р: //java.sun.com/jsf/composite/hrgi». Я добавил новую информацию. Спасибо за внимание. – brevleq

+0

Я адаптировал «componente.getFacet (« conteudo »). GetChildren(). Clear();" из второго подхода вы можете увидеть здесь: https://cwiki.apache.org/MYFACES/clear-input-components.html. Есть ли другой способ я могу очистить все компоненты страницы без проблем в моих составных компонентах? – brevleq

 Смежные вопросы

  • Нет связанных вопросов^_^