JSF - Mensagens de erro internacionalizáveis

19 respostas
R

Caros,

tenho os seguintes arquivos:

error_pt_BR.properties
javax.faces.component.UIInput.REQUIRED={0} deve ser preenchido

error_en_US.properties
javax.faces.component.UIInput.REQUIRED={0} must be entered

Tambem declarei o message bundle no faces-config.No entanto,as mensagens de erro que estão dando são as mensagens padrão do JSF.O que está faltando?

Grato

19 Respostas

K

Cara, as vzs é pq na sua jsp ta pegando a msg padrão que é detail. Tenta colocar essas linhas novas que
adicionei e ve se funciona.

error_pt_BR.properties
javax.faces.component.UIInput.REQUIRED={0} deve ser preenchido
javax.faces.component.UIInput.REQUIRED_detail={0} deve ser preenchido

error_en_US.properties
javax.faces.component.UIInput.REQUIRED={0} must be entered
javax.faces.component.UIInput.REQUIRED_detail={0} must be entered

Flw

renomoto

Legal, indo por essa linha…
Como trabalhar com mensagens na parte do MB e Persistencia.
Por exemplo,

ManageBean
Aqui vc tem os dados que vem do jsp e vc encaminha pro Gerenciador que irá persistir os dados.
Como eu vou mandar as mensagens internacionalizadas? Pq vai depender do LOCALE que está configurado.

Classe Gerenciador
Nessa classe vc tem a persitencia, se vc tiver alguma mensagem de erro como passar? vc vai depender do LOCALE que está configurado. vc irá passar como parametro para a classe?

Não sei se ficou claro.
mas se alguem tiver ideias de como passar.

[]'s

Jair_Rillo_Junior

Segue o exemplo de um método, que retorna mensagem de erro (com internacionalização) diretamente de um ManagedBean para a Interface

protected void addErrorMessage(String clientId, String key) {
		// Look up the requested message text
		String text = null;
		try {
			ResourceBundle bundle = ResourceBundle.getBundle("messages", facesContext.getViewRoot().getLocale());
			text = bundle.getString(key);
		} catch (Exception e) {
			System.out.println(e.toString());
		}
		// Construct and add a FacesMessage containing it
		facesContext.addMessage(clientId, new FacesMessage(FacesMessage.SEVERITY_ERROR, text, text));
	}

No exemplo acima, eu estou usando um arquivo chamado messages.properties, ai no caso de internacionalização, pode se usar messages_pt_BR.properties, e etc

renomoto

Blz… e se vc tiver uma mensagem na classe q vc chama no MB vc vai passar o LOCALE como parametro?

[]'s

L

renomoto:

Classe Gerenciador
Nessa classe vc tem a persitencia, se vc tiver alguma mensagem de erro como passar? vc vai depender do LOCALE que está configurado. vc irá passar como parametro para a classe?

O que o ManchesteR falou está correto, mas eu preciso lembrar de uma coisa: nunca exiba mensagens de camadas de negócio na sua tela de apresentação. Essas mensagens servem apenas para os desenvolvedores, não para os usuários do sistema. O ideal é criar uma família de classes de exceções; e no managed bean, pra cada tipo de exceção, gera uma mensagem de erro diferente.

No Managed Bean, buscar mensagem de resource bundle é isso:

FacesContext context = FacesContext.getCurrentInstance();
UIViewRoot viewRoot = context.getViewRoot();
Locale locale = viewRoot.getLocale();
ClassLoader loader = Thread.currentThread().getContextClassLoader();
ResourceBundle bundle = ResourceBundle.getBundle("messages", locale, loader);
String message = bundle.getString("message.key");
renomoto

não entendi o q vc quis dizer.

eu imagino o seguinte…

um jsp que tem sua validações e qdo satisfazer passa para o MB se eu quiser fazer validações e mandar msg posso utilizar o método descrito acima.

mas se tiver uma outra classe que chama e gera excecao como fazer para passar msg.

bom, se vc explicou isso no q vc’s falaram coloca um exemplo q eu viajei.

Jair_Rillo_Junior

Mais ou menos assim:

Não tente gerar as mensagens de erro do seu BEAN, Camada de negocio, de dominio, que seja… diretamente para a camada de apresentação.
Ao invés disso, você deve fazer que essas classes gerem exceções, e essas exceções devem ser tratadas no ManagedBean. Ele sim irá preparar as mensagens de erro.

Algo do tipo

Bean

public class MyBean() {

  public void fazAlgumaCoisaDaMinhaRegraDeNegocio() throws UmaExceptionQualquer {
  //
  }
}

No seu ManagedBean, que você deve tratar a exception e preparar menagem de erro para a camada de apresentação

public class MyManagedBean {
  
  public String doSubmit() {
    try {
      myBean.fazAlgumaCoisaDaMinhaRe..();
   catch (UmaExceptionQualquer E) {
      //faz o tratamento do erro aqiu e/ou retorna mensagem de erro
   }
  }
}

seria algo assim :wink:

renomoto

entao vc ta me dizendo q se eu quiser fazer qualquer validacao eu faco no MB ou no Bean e lanco a excecao e exibo a mensagem de erro?

[]s

L

renomoto:
entao vc ta me dizendo q se eu quiser fazer qualquer validacao eu faco no MB ou no Bean e lanco a excecao e exibo a mensagem de erro?

[]s

Não.

A validação é feita em qualquer objeto de negócio. O que eu quero dizer, é que no momento em que a validação falhar, não será gerada uma mensagem do tipo:

throw new Exception("Usuario " + userId + " inexistente");

mas sim algo do tipo:

throw new UsuarioInexistenteException(userId);

A validação não pode ser adiada para alguma outra camada (ficaria difícil de debugar), o que o Managed Bean deve fazer é simplesmente tratar todas as exceções de chamadas a outros objetos.

R

Coloquei,e nada…Alguem tem mais alguma ideia?

Grato

Jair_Rillo_Junior

Como está seu faces-config.xml? Referente a parte de Resource Bundle?
Onde você está deixando os arquivos error*.properties? qual diretorio?

R

Estou colocando na raiz do /src,e no faces-config estou fazendo assim:
[code]

error

E tenho os arquivos error_pt_BR.properties,error_en_UK.properties etc...

Abraço

Jair_Rillo_Junior

tem o arquivo error.properties?

Se nao, cria ele apenas para teste e verifica se funciona

R

Criei,e estranhamente não funcionou…

Jair_Rillo_Junior

Poe estranho.

Não sei se você ainda fez isso, mas na tag <f:view> poe o seguinte atributo:

<f:view locale="#{facesContext.externalContext.request.locale}">
R

Meu locale eu pego assim:

<f:view locale="#{configController.locale}">

onde locale eh um java.util.Locale que eu monto dinamicamente,e isso funciona direitinho…

Jair_Rillo_Junior

o que eu te passei, é um default do JSF. É indicado usar ele quando quer trabalhar com internacionalização.

Testa o que eu te passei e ve se funciona
Se não funcionar meu amigo, ai eu não tenho mais dicas

R

Pessoal,

com relação ás mensagens de erro,agora está acontecendo o seguinte:
estou usando o jsf 1.1(SUN RI) ,e ao submeter um form com um campo obrigatório está sendo mostrado isso na tela:

{0}is required

ou seja,é como se o id do campo não fosse encontrado.
Me disseram que só a partir do JSF 1.2 é que o “{0}” é substituido pelo id do campo,alguem sabe se é assim mesmo?

Obrigado,
Rafael Roque

J

Comigo isso também acontece… tudo é exibido com o {0}…

é a versão do JSF?

Criado 31 de outubro de 2007
Ultima resposta 26 de set. de 2008
Respostas 19
Participantes 6