2014-04-25 4 views
0

나는 Primefaces dialog을 가지고 있으며 그 안에 tabView이 있습니다. 이 tabView에는 3 개의 탭이 있는데, 각 탭은 ui : include로 호출됩니다. 첫 번째 탭에서 클래스의 tipoProprietario이라는 속성을 정의하는 selectOneMenu이 있습니다. 탭 사이의 탐색은 탭 자체가 아니라 (이 단계에서는 비활성화 됨) 대화 상자의 아래쪽에있는 commandButtons를 통해 수행됩니다. 첫 번째 탭에서 두 번째 탭으로 전달할 commandButton을 클릭하면 tipoProprietario이 올바르게 채워집니다. 그러나 두 번째로 세 번째 탭 (또는 첫 번째 탭까지)을 클릭하면 selectItem 값이 null으로 변경되었습니다. 결과적으로 tipoProprietario 속성도 null으로 변경됩니다. 디버깅을하면서 먼저 Select Item Listener 메서드라고 부르며 tipoProprietario 설정 기 이후에 해당 항목을 보았습니다.p : 탭을 변경하면 selectOneMenu가 변경됨

왜 이런 일이 일어나는 지 설명 할 수 있습니까? 그것을 고치는 방법?

dialog.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:p="http://primefaces.org/ui"> 
    <p:dialog id="dlgEdicao" widgetVar="dlgEdicao" resizable="false" 
     closable="true" modal="true" closeOnEscape="true" 
     header="#{(proprietarioMB.edicao)? msg['proprietario.titulo.editar']: msg['proprietario.titulo.incluir']}"> 
     <p:tabView id="tabEdicao" widgetVar="tabEdicao" dynamic="true" 
      styleClass="tabEdicaoProprietario" cache="false" 
      binding="#{proprietarioMB.tabEdicao}"> 
      <p:tab id="tabProprietario" title="#{msg['proprietario.titulo']}" 
       disabled="#{not proprietarioMB.edicao}" titleStyleClass=""> 
       <ui:include src="./aba_proprietario.xhtml" /> 
      </p:tab> 
      <p:tab id="tabEnderecoContato" 
       title="#{msg['proprietario.titulo.aba.endereco']}" 
       disabled="#{not proprietarioMB.edicao}"> 
       <ui:include src="./aba_endereco_contato.xhtml" /> 
      </p:tab> 
      <p:tab id="tabVeiculo" 
       title="#{msg['proprietario.titulo.aba.veiculo']}" 
       disabled="#{not proprietarioMB.edicao}"> 
       <ui:include src="./aba_veiculo.xhtml" /> 
      </p:tab> 
     </p:tabView> 

     <f:facet name="footer"> 
      <p:commandButton id="btnDialogoAnterior" 
       value="#{msg['titulo.anterior']}" 
       rendered="#{not proprietarioMB.edicao}" immediate="true" 
       disabled="#{not proprietarioMB.btnAnteriorHabilitado}" 
       actionListener="#{proprietarioMB.doEventClickBtnAnterior}" 
       update="@this tabEdicao btnDialogoSeguinte btnDialogoConcluir" 
       style="margin-right: 20px;" /> 

      <p:commandButton id="btnDialogoSeguinte" 
       value="#{msg['titulo.proximo']} #{(not proprietarioMB.btnConcluirVisivel)? '': 'display: none;'}" 
       rendered="#{not proprietarioMB.edicao}" 
       actionListener="#{proprietarioMB.doEventClickBtnSeguinte}" 
       update="@this tabEdicao btnDialogoAnterior btnDialogoConcluir" 
       style="margin-right: 20px; #{(not proprietarioMB.btnConcluirVisivel)? '': 'display: none;'}" /> 

     </f:facet> 

    </p:dialog> 
</ui:composition> 

aba_proprietario.xhtml (제 TAB)

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:p="http://primefaces.org/ui"> 
    <p:panel id="pnlDadosProprietario"> 
     <p:focus for="selTipoEdicao" /> 
     <p:fieldset id="fieldDadosProprietario" 
      legend="#{msg['proprietario.titulo']}" 
      rendered="#{not empty proprietarioMB.proprietario}"> 
      <p:panelGrid id="pnlDadosProprietarioEdicao"> 
       <p:row> 
        <p:column> 
         <p:outputLabel id="lblTipoEdicao" 
          value="#{msg['proprietario.titulo.tipo']}" for="selTipoEdicao" /> 
        </p:column> 
        <p:column> 
         <p:selectOneMenu id="selTipoEdicao" 
          value="#{proprietarioMB.proprietario.tipoProprietario}" 
          valueChangeListener="#{proprietarioMB.doEventTipoDocumentoPesquisaChanged}" 
          immediate="true"> 
          <f:selectItems value="#{proprietarioMB.tiposProprietarios}" /> 
          <p:ajax event="change" update="txtDocumentoEdicao" /> 
         </p:selectOneMenu> 
        </p:column> 
        <p:column> 
         <p:outputLabel id="lblDocumentoEdicao" 
          value="#{msg['proprietario.titulo.documento']}" 
          for="txtDocumentoEdicao" /> 
        </p:column> 
        <p:column> 
         <p:inputMask id="txtDocumentoEdicao" 
          value="#{proprietarioMB.proprietario.documento}" 
          mask="#{proprietarioMB.mascaraDocumento}" /> 
        </p:column> 
       </p:row> 
      </p:panelGrid> 
     </p:fieldset> 
    </p:panel> 
</ui:composition> 

관리 빈을

@ManagedBean 
@ViewScoped 
public class ProprietarioMB { 


    private static final String MASCARA_CPF = "999.999.999-99"; 

    private static final String MASCARA_CNPJ = "99.999.999/9999-99"; 

    private static final SelectItem[] tiposProprietarios = new SelectItem[] { 
      new SelectItem(JURIDICA, JURIDICA.getDescricao()), 
      new SelectItem(FISICA, FISICA.getDescricao()), }; 

    private ProprietarioORM proprietario; 

    private String mascaraDocumento; 

    private TabView tabEdicao; 

    /** 
    * Select Item listener method: Changes inputMask mask 
    */ 
    public void doEventTipoDocumentoPesquisaChanged(ValueChangeEvent event) { 
      this.mascaraDocumento = (event.getNewValue() == FISICA) ? MASCARA_CPF 
        : MASCARA_CNPJ; 
    } 

    public void doEventClickBtnAnterior() { 
     System.out.println("ProprietarioMB.doEventClickBtnAnterior(): " 
       + this.tabEdicao.getActiveIndex()); 
      this.tabEdicao.setActiveIndex(this.tabEdicao.getActiveIndex() - 1); 
    } 

    public void doEventClickBtnSeguinte() { 
     System.out.println("ProprietarioMB.doEventClickBtnSeguinte(): " 
       + this.tabEdicao.getActiveIndex()); 
     System.out.println("ProprietarioMB.doEventClickBtnSeguinte(): " 
       + this.proprietario); 
     if (this.tabEdicao.getActiveIndex() == 0) { 
      if (this.validarProprietario()) { // Validation method 
       this.tabEdicao.setActiveIndex(1); 
      } 
     } else if (this.tabEdicao.getActiveIndex() == 1) { 
      this.tabEdicao.setActiveIndex(2); 
     } 
    } 

    // Other methods + getters & setters 

} 

ProprietarioORM

public class ProprietarioORM { 

    private String nome; 

    private TipoProprietarioEnum tipoProprietario; 

    // getters & setters 

} 

답변

0

그것은 때문에 한 가지를 들어 binding="#{proprietarioMB.tabEdicao}"

의 대부분, 당신은 모든 바인딩을 필요로 표시되지 않습니다. 그렇더라도, <p:tabView/>이 null 변수 tabEdicao에 바인드하려고하는 버그가되는 백킹 빈의 구성 요소를 초기화하지 못했습니다.

backing bean에서 tabview 변수를 사용하지 않는 것처럼 보이므로 내 권장 사항은 제거하는 것입니다. 당신이 정말로 그것을 필요하면 그냥 초기화 :

private TabView tabEdicao = new TabView(); 
0

Kolossus을 : 나는 대화에 attibute dynamic="true"을 추가 할 때

이 문제는 해결되었습니다. 실제로, 실제 값은 dynamic=#{empty proprietarioMB.proprietario}이었습니다. 페이지를로드 할 때 NullPointerException이 나왔기 때문입니다. proprietario 속성은 @PostConstruct 방법으로로드됩니다.

관련 문제