Problema com form JSF

Pessoal, passei o dia tentando construir um form JSF que faça Upload de arquivo, sendo que estou tendo problemas. Simplesmente, ao submeter o formulário, a página recarrega.

Já coloquei algumas flags no meu código para saber até onde ele está chegando, também já utilizei o Debug do NetBeans. Com isso, cheguei na conclusão de que o método do meu Bean setado no action do CommandButton não está funcionando, ou seja, a página não está acionando o método do Bean que vai tratar os dados e efetuar o upload.

Eis o código:

<%@ include file="/default/top.jsp" %>  

<f:view>   
    <h:form id="add_ontology" enctype="multipart/form-data">
        <h:panelGrid columns="1" headerClass="boxTituloPagina" 
                     styleClass="boxCorpoPagina">
            <f:facet name="header">
                <h:outputText id="pageTitle" value="Adicionar Ontologia" 
                              styleClass="tituloPagina"/>
            </f:facet>
            
            <h:outputText id="ont_file_txt" value="Arquivo *.owl para carregar:" 
                          styleClass="textoForm1" />    	

            <t:inputFileUpload id="ont_file" value="#{addOntologyBean.file}" 
                               size="67" storage="file" required="true" 
                               accept="/owl/*">
                <f:validator validatorId="uploadValidator"/>
            </t:inputFileUpload>

            <h:outputText id="ont_name_txt" value="Nome da Ontologia:" 
                          styleClass="textoForm1"/>
            <h:inputText maxlength="100" size="68" id="ont_name_vlr" 
                         value="#{addOntologyBean.ontName}" />	
            
            <h:outputText id="know_area_txt" 
                          value="Área do conhecimento a qual pertence:" 
                          styleClass="textoForm1"/>
            
            <h:selectOneMenu id="know_area_vlr" value="#{addOntologyBean.relatedKnowArea}">
                <f:selectItems value="#{addOntologyBean.allKnowAreas}"/>
            </h:selectOneMenu>
            
            <h:outputText id="ont_descript_txt" value="Breve descrição:" 
                          styleClass="textoForm1"/>
            <h:inputTextarea  id="ont_descript_vlr" rows="4" cols="50" 
                              value="#{addOntologyBean.ontDescription}"/>
            
            <h:commandButton id="cmb_entrar" value="Salvar" styleClass="botao" 
                             action="#{addOntologyBean.doSaveNew}" />
                            
            <h:message for="add_ontology" styleClass="errorMessage"/>
            <h:message id="uploadError" for="ont_file" styleClass="errorMessage"/>
        </h:panelGrid>
    </h:form>
</f:view>

<%@ include file="/default/footer.jsp"  %>

Uma coisa interessante que constatei é que, se eu comentar o bloco a seguir do código mostrado acima, o upload funciona corretamente. Fico encucado porque não consigo entender o que tem de errado neste bloco:


            <h:selectOneMenu id="know_area_vlr" value="#{addOntologyBean.relatedKnowArea}">
                <f:selectItems value="#{addOntologyBean.allKnowAreas}"/>
            </h:selectOneMenu>

Antes que peçam também o próprio Bean, vou colar aqui os métodos relacionados com o código “defeituoso” acima:

public class AddOntology {
    
    //private String          fileName;
    private UploadedFile    file;
    //private long            fileSize;
    private String          ontName;
    private String          ontDescription;
    private SelectItem      relatedKnowArea;
    
    private ArrayList       allKnowAreas;
    
    //-------------------------------------------------------------------------
    
    public AddOntology() {
        
        try{
            Knowledge knowledge;
            
            knowledge            = new Knowledge();
            this.allKnowAreas    = knowledge.getAllKnowledgeAreas(); 
            //this.relatedKnowArea = (SelectItem) knowledge.getAllKnowledgeAreas().get(0);
        } catch (PersistenceException e) {
            this.allKnowAreas   = new ArrayList();
            this.allKnowAreas.add(new SelectItem("nenhum",
                    "Não foi possível conectar à base"));
        }
        
    }
    
    //-------------------------------------------------------------------------
    
    public UploadedFile getFile() {  
        return this.file;  
    }  
   
    public void setFile(UploadedFile file) {
        this.file = file;  
    }

    //-------------------------------------------------------------------------
    
    public String getOntName() {
        return this.ontName;
    }
    
    public void setOntName(String ontName) {
        this.ontName = ontName;
    }
    
    //-------------------------------------------------------------------------
    
    public String getOntDescription() {
        return this.ontDescription;
    }
    
    public void setOntDescription(String ontDescription) {
        this.ontDescription = ontDescription;
    }
    
    //-------------------------------------------------------------------------
    
    public SelectItem getRelatedKnowArea() {
        return this.relatedKnowArea;
    }
    
    public void setRelatedKnowArea(SelectItem relatedKnowArea) {
        this.relatedKnowArea = relatedKnowArea;
    }
    
    //-------------------------------------------------------------------------
    
    public ArrayList getAllKnowAreas() {
        return this.allKnowAreas;
    }

    public void setAllKnowAreas(ArrayList allKnowAreas) {
        this.allKnowAreas = allKnowAreas;
    }

    //-------------------------------------------------------------------------
    
    public String doSaveNew() {
        ... 

        /* Não é nessa parte pois como já disse, se eu comentar o código do selectItem, esse método é acionado e funciona 
            tudo perfeitamente. */
    }

}

Alguém pode me dar uma luz? Já tentei de tudo.

Qual o escopo de “addOntologyBean”? coloca ele pra session. O jsf vai procurar na lista “allKnowAreas”, se nao tiver nada la num vai funfar. Outra solucao pode ser colocar t:saveState.

Algumas sugestões…pode não ser isso…

[]´s

Humberto Lima.

Pois é, na verdade existiam dois problemas ai que não estavam possibilitando a correta utilização do form.

  1. No Bean, a variável da classe responsável pelo campo SelectOneItem era do tipo SelectItem e não do tipo String. Isso estava gerando um erro que só consegui vê-lo quando, por acaso, adicionei uma linha que mostrasse erros nos campos, quando estava fazendo a validação.

  2. Mesmo depois de mudar SelectItem para String, o problema se manteve. Descobri então que o problema estava no include do começo da página. A página final estava sendo gerada com dois blocos <f:view>, o que, segundo algumas páginas que consultei ontem, não pode acontecer. Dessa forma, o primeiro <f:view> estava funcionando, pois ele era o responsável por gerar o menu do meu sistema. O problema era no segundo <f:view>, onde estava meu form.

Corrigi o problema colocando o include para o menu na propria pagina e dentro da <f:view> da pagina, eliminando outra chamada à mesma tag.

Agradeço pela colaboração.