O <t:message> não é exibido corretamente ao usar <t:inputFileUpload> dentro de <t:PanelTabbedPane>

StackOverflow https://stackoverflow.com/questions/66912

  •  09-06-2019
  •  | 
  •  

Pergunta

Em uma página JSP, criei um <h:form enctype="multipart/form-data"> com alguns elementos: <t:inputText>, <t:inputDate>, etc.Além disso, adicionei alguns <t:message for="someElement"> E eu queria permitir que o usuário carregasse vários arquivos (um de cada vez) dentro do formulário (usando <t:inputFileUpload> ) Neste ponto, meu código funciona bem.


A dor de cabeça surge quando tento colocar o formulário dentro de um <t:panelTabbedPane serverSideTabSwitch="false"> (e, portanto, é claro, dentro de um <t:panelTab> )

Copiei a estrutura mostrada no código-fonte do exemplo TabbedPane de Exemplos de Tomahawk, usando o <f:subview> tag e colocar a tag panelTab dentro de uma nova página jsp (usando <jsp:include page="somePage.jsp"> diretiva)

Em primeiro lugar, o <t:inputFileUpload> falha ao carregar o arquivo no valor atribuído no atributo Managed Bean UploadedFile #{myBean.upFile}

Então, procurando uma pista no Google, Eu sabia <t:panelTabbedPane> gera um formulário chamado "autoform", então eu estava obtendo formulários aninhados.Ok, eu consertei isso criando o <h:form> Fora de <t:panelTabbedPane> e eureca!entrada de arquivo funcionou novamente!(o autoform não gera)

Mas, ah, surpresa!oh terrível lei de Murphy!Todo meu <h:message> começa a falhar.A saída do console do Eclipse me mostra que tudo <t:message> estão procurando ID's de elementos inexistentes (que têm seus ID's em parte iguais aos que procuram, mas no final dos ID's seus nomes mudam)

Neste momento coloquei um <t:mesagges> tag (observe o "s" no final) para me mostrar todos os erros de validação de uma vez no início do Painel, e funciona bem.Portanto, existem erros de validação e eles aparecem corretamente no início do Painel.

Todas as mensagens de erro de validação geradas nesta página são mensagens de validação integradas do JSF.O backing bean neste momento não possui nenhum validador definido.

¿Como posso obter o <t:message for="xyz"> trabalhando corretamente?


Estou usando o Tomahawk-1.1.6 com myFaces-impl-1.2.3 em um projeto Eclipse Ganymede com Geronimo como servidor de aplicativos (Geronimo me fornece a implementação do jar myFaces enquanto coloco o jar tomahawk na pasta WEB-INF/lib do aplicativo)


"RESOLVIDO":Este problema é relatado no fórum myFaces.

Obrigado a Kyle Renfro pela breve resposta e informação.(Bom trabalho Kyle!)Veja o problema


EDITAR 1

1.- Obrigado a Kyle Renfro pela sua breve resposta.O atributo forceID usado dentro do elemento input não funciona na primeira vez, mas fazendo alguns ajustes bem complicados eu poderia fazer o <t:message for="xyz"> tags funcionam.

O que eu fiz foi:
1.Ter minha tag <inputText id="name" forceId="true" required="true"> O <t:message> não funciona.
2.Então, depois de analisar as mensagens de erro no console do Eclipse, renomeei meu atributo “id” para isto:<inputText id="nomej_id_1"forceId="true" obrigatório="true">
3.Então o <t:message> trabalhado!!mas depois de pressionar o botão "Enviar" do formulário pela segunda vez.A segunda vez!(Suspeito que algo esteja acontecendo no ciclo de vida do JSF)
4.Isso implica que o usuário deve pressionar 2 vezes o botão enviar para obter as mensagens de erro na página.
5.E usar a frase “j_id_1” no final dos IDs é muito estranho.


EDITAR 2

Ok, aí vem o código, espero que não seja chato.

1.- mainPage.jsp (aqui está o <t:panelTabbedPane> e <f:subview> Tag)

<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>  
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>  
<%@ taglib prefix="t" uri="http://myfaces.apache.org/tomahawk"%>  
<html>  
<body>  
<f:view>  
<h:form enctype="multipart/form-data">  
<t:panelTabbedPane serverSideTabSwitch="false" >  

            <f:subview id="subview_tab_detail">  
                <jsp:include page="detail.jsp"/>  
            </f:subview>  

        </t:panelTabbedPane>  
    </h:form>  

</f:view>  
</body>  
</html>  


2.- detalhe.jsp (aqui está o <t:panelTab> marcação)

<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>  
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>  
<%@ taglib prefix="t" uri="http://myfaces.apache.org/tomahawk"%>  

<t:panelTab label="TAB_1">  
        <t:panelGrid columns="3">  
            <f:facet name="header">  
                <h:outputText value="CREATING A TICKET" />  
            </f:facet>  

            <t:outputLabel for="ticket_id" value="TICKET ID" />  
            <t:inputText id="ticket_id" value="#{myBean.ticketId}" required="true" />  
            <t:message for="ticket_id" />  

            <t:outputLabel for="description" value="DESCRIPTION" />  
            <t:inputText id="description" value="#{myBean.ticketDescription}" required="true" />
            <t:message for="description" />  

            <t:outputLabel for="attachment" value="ATTACHMENTS" />  
            <t:panelGroup>  
                <!-- This is for listing multiple file uploads -->  
                <!-- The panelGrid binding make attachment list grow as the user inputs several files (one at a time) -->  
                <t:panelGrid columns="3" binding="#{myBean.panelUpload}" />  
                <t:inputFileUpload id="attachment"  value="#{myBean.upFile}" storage="file" />  
                <t:commandButton value="ADD FILE" action="#{myBean.upload}" />  
            </t:panelGroup>  
            <t:message for="attachment" />  

            <t:commandButton action="#{myBean.create}" value="CREATE TICKET" />  
        </t:panelGrid>  
</t:panelTab>  

EDITAR 3

Em resposta ao acompanhamento de Kyle Renfro:

Kyle diz:

"Na primeira visualização da página, se você pressionar o botão "CREATE TICKET" sem nada em nenhum dos inputTexts e nenhum arquivo carregado, as tags de mensagem funcionam para os inputTexts?(ou seja.require = true) Estou curioso para saber se as mensagens para inputTexts estão funcionando, mas a mensagem para inputFileUpload não."

Aqui está o comportamento encontrado:
1.- Não há nenhuma mensagem de erro de validação mostrada (as tags de mensagem não funcionam) Mesmo quando tento testar apenas uma mensagem de erro de validação (por exemplo, testando a mensagem para o primeiro texto de entrada) nenhuma delas aparece .
2.- O console do Eclipse me mostra estes erros internos:

ERROR [HtmlMessageRendererBase] Could not render Message. Unable to find component 'ticket_id' (calling findComponent on component 'j_id_jsp_1383779881_1:subview_tab_detail:j_id_jsp_1716158401_0j_id_1:j_id_jsp_1716158401_5j_id_1'). If the provided id was correct, wrap the message and its component into an h:panelGroup or h:panelGrid.  
ERROR [HtmlMessageRendererBase] Could not render Message. Unable to find component 'description' (calling findComponent on component 'j_id_jsp_1383779881_1:subview_tab_detail:j_id_jsp_1716158401_0j_id_1:j_id_jsp_1716158401_8j_id_1'). If the provided id was correct, wrap the message and its component into an h:panelGroup or h:panelGrid.  
ERROR [HtmlMessageRendererBase] Could not render Message. Unable to find component 'attachment' (calling findComponent on component 'j_id_jsp_1383779881_1:subview_tab_detail:j_id_jsp_1716158401_0j_id_1:j_id_jsp_1716158401_14j_id_1'). If the provided id was correct, wrap the message and its component into an h:panelGroup or h:panelGrid.  

Foi aqui que eu vi o "j_id_1" palavra nos IDs gerados, por exemplo, para o id "ticket_id":

j_id_jsp_1383779881_1:subview_tab_detail:j_id_jsp_1716158401_0j_id_1:j_id_jsp_1716158401_5j_id_1

E, visualizando a página gerada pelo HTML resultante, vi que os nomes dos IDs são assim (sem usar o atributo "ForceId"):

<input id="j_id_jsp_1383779881_1:subview_tab_detail:j_id_jsp_1716158401_0j_id_1:ticket_idj_id_1" name="j_id_jsp_1383779881_1:subview_tab_detail:j_id_jsp_1716158401_0j_id_1:ticket_idj_id_1">  

Foi útil?

Solução

Parece que pode estar relacionado a um bug no myfaces.Existe uma versão mais recente do myfaces e do tomahawk que você pode experimentar.Eu removeria a funcionalidade de subvisão como um teste rápido - copie a página detail.jsp de volta para a página principal.

https://issues.apache.org/jira/browse/MYFACES-1807?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12567158#action_12567158

Outras dicas

O forçarId O atributo dos componentes da machadinha deve resolver este problema.

algo como:

&lt;t:outputText id="xyz" forceId="true" value="#{mybean.stuff}"/&gt;

Na primeira visualização da página, se você pressionar o botão "CREATE TICKET" sem nada em nenhum dos inputTexts e nenhum arquivo carregado, as tags de mensagem funcionam para os inputTexts?(ou seja.obrigatório = verdadeiro) Estou apenas curioso para saber se as mensagens para inputTexts estão funcionando, mas a mensagem para inputFileUpload não.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top