[RESOLVIDO] Mensagem personalizada de erro - JSF- AJUDA

5 respostas
J

Caros colegas,

Estou tentanto utilizar uma messagem personalizada para informar ao usuário um erro na inserção de uma data em um formulário. Contudo a mensagem personalizada não aparece!

Tenho os seguintes arquivos em minha aplicação web:

index.jsp:
<html>
   <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
   <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
   <f:view>
      <f:loadBundle basename="com.corejsf.messages" var="msgs"/>
      <head>
         <link href="styles.css" rel="stylesheet" type="text/css"/>
         <title>
            <h:outputText value="#{msgs.title}"/>
         </title>
      </head>
      <body>
         <h:form>
            <h1><h:outputText value="#{msgs.paymentInformation}"/></h1>
            <h:panelGrid columns="3">
            	<h:outputText value="#{msgs.amount}"/>
	            <h:inputText id="amount" label="#{msgs.amount}"
	            		value="#{payment.amount}">
	               <f:convertNumber minFractionDigits="2"/> 
	            </h:inputText>
	  			<h:message for="amount" styleClass="errorMessage"/>
	
	            <h:outputText value="#{msgs.creditCard}"/>
	            <h:inputText id="card" label="#{msgs.creditCard}"
	            		value="#{payment.card}"/>
				<h:panelGroup/>
	
	            <h:outputText value="#{msgs.expirationDate}"/>
	            <h:inputText id="date" label="#{msgs.expirationDate}"
	            		value="#{payment.date}">
	            <f:convertDateTime pattern="MM/yyyy"/>
	            </h:inputText>
	            <h:message for="date" styleClass="errorMessage"/>            
            </h:panelGrid>
            <h:commandButton value="#{msgs.process}" action="process"/>
		 </h:form>
	  </body>
   </f:view>
</html>
meu bean:
package com.corejsf;

import java.util.Date;

public class PaymentBean {
	private double amount;
	private String card = "";
	private Date date = new Date();
	
	public double getAmount() { return amount; }
	public void setAmount(double amount) { this.amount = amount; }
	
	public String getCard() { return card; }
	public void setCard(String card) { this.card = card; }
	
	public Date getDate() { return date; }
	public void setDate(Date date) { this.date = date; }
	
}
faces-config.xml:
<?xml version="1.0"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
	version="1.2">
   <navigation-rule>
      <from-view-id>/index.jsp</from-view-id>
      <navigation-case>
         <from-outcome>process</from-outcome>
         <to-view-id>/result.jsp</to-view-id>
      </navigation-case>
   </navigation-rule>

   <navigation-rule>
      <from-view-id>/result.jsp</from-view-id>
      <navigation-case>
         <from-outcome>back</from-outcome>
         <to-view-id>/index.jsp</to-view-id>
      </navigation-case>
   </navigation-rule>
   
   <managed-bean> 
      <managed-bean-name>payment</managed-bean-name>
      <managed-bean-class>com.corejsf.PaymentBean</managed-bean-class> 
      <managed-bean-scope>session</managed-bean-scope> 
   </managed-bean>

   <application>
      <resource-bundle>
         <base-name>com.corejsf.messages</base-name>
         <var>msgs</var>
      </resource-bundle>
   </application>
   
</faces-config>
messages.properties
title=Uma aplicação para testar conversão de dados
enterPayment=Entre com as informações sobre o pagamento
amount=Valor
creditCard=Cartão de Crédito
expirationDate=Data de validade (Mês/Ano)
process=Processar
paymentInformation=Informação do pagamento
javax.faces.component.UIInput.CONVERSION=Formato Inválido
javax.faces.component.UIInput.CONVERSION_detail=Formato Inválido(detalhe)

Quando eu digito, por exemplo, "01" (sem aspas, é claro) no campo "Data de validade (Mês/ano)" e clico no botão processar ele apresenta a seguinte mensagem:

Data de validade (Mês/Ano): '01' não pode ser interpretado como data. Exemplo: 01/2010

Acredito eu, que essa seja uma mensagem padrão do JSF. Mesmo no bundle tendo sido setada a mensagem "Formato inválido". Sabendo q a tag message exibe, por default, o detalhamente e não exibe o resumo, criei, para testar uma propriedade "_detail" (como mostrado no messages.properties acima) e nem assim a messagem personalizada não aparece. Seria pq falta algo no index.jsp para indicar q ele deve buscar a propriedade "javax.faces.component.UIInput.CONVERSION=Formato Inválido" no bundle?!?!

Desde já agradeço a atenção!

5 Respostas

J

Alguma idéia!??!

V

Oi!

Creio que oque voce quer esteja aqui http://fisheye5.atlassian.com/browse/javaserverfaces-sources/jsf-api/src/javax/faces/Messages_pt_BR.properties?r=1.1.2.1
procure por DateTimeConverter

Tem este link tambem com outras constantes http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/constant-values.html

J

jeverson, para isso você usa converters e/ou validators: http://www.ibm.com/developerworks/java/library/j-jsf3/

J

Caro vi-gb,
O link q vc me passou ajudou-me a perceber q eu deveria setar no .properties as seguintes propreidades:
javax.faces.converter.DateTimeConverter.DATE
javax.faces.converter.DateTimeConverter.DATE_detail

ao invés de:
javax.faces.component.UIInput.CONVERSION
javax.faces.component.UIInput.CONVERSION_detail

Em seguida, bastou eu fazer algumas alterações no meu faces-config.xml, conforme demonstrado a seguir.

vlw pela dica!

Caro juliofsn,
O link q vc me passou fala sobre a criação customizada ou somente personalização de msgs para conversores e validadores através de MB’s. Porém, estava a procura de uma solução via arquivo de propriedade. Contudo, acho o link super válido, visto que, nem sempre, a solução com o uso de .properties é a mais viável. Excelente dica! Obrigado pelo apoio

J

Aos colegas que porventura vistem esse tópico em busca d solução aew vai o que implementei com a ajuda dos companheiros aki do GUJ.

messages.properties:

title=Uma aplicação para testar conversão de dados enterPayment=Entre com as informações sobre o pagamento amount=Valor creditCard=Cartão de Crédito expirationDate=Data de validade (Mês/Ano) process=Processar paymentInformation=Informação do pagamento javax.faces.converter.DateTimeConverter.DATE=Data inválida javax.faces.converter.DateTimeConverter.DATE_detail=O valor "{0}" do campo "{2}" é inválido! Exemplo: {1}

adicionar ao faces-config.xml:

<application> <message-bundle>com.corejsf.messages</message-bundle> <locale-config> <default-locale>pt_BR</default-locale> </locale-config> </application>

por fim, a index.jsp: <h:outputText value="#{msgs.expirationDate}"/> <h:inputText id="date" label="#{msgs.expirationDate}" value="#{payment.date}"> <f:convertDateTime pattern="MM/yyyy"/> </h:inputText> <h:message for="date" styleClass="errorMessage"/>

Dessa forma a saída produzida para o erro é a seguinte:
O valor “01” do campo “Data de validade (Mês/Ano)” é inválido! Exemplo: 01/2010

Criado 6 de janeiro de 2010
Ultima resposta 11 de jan. de 2010
Respostas 5
Participantes 3