Marcos Sousa’s Blog

Blog sobre desenvolvimento de software
  • rss
  • Home
  • Sobre

Dicas JSF 1.2: Não use nome de resource e propriedade de beans iguais. Saiba pq.

Marcos Sousa | May 20, 2008

Hoje, durante o trabalho tive um problema bastante interessante. Uma aplicação que estou desenvolvendo, usa JSF 1.2. Estava desenvolvendo um cadastro que tinha uma caixa de seleção, esta caixa de seleção carregava todos os clientes cadastrados. Estou usando os recursos de internacionalização e os recursos de declaração de resource-bundle do JSF 1.2, para centralizar o local onde são declarados os recursos de mensagens. Até aí tudo bem.

Algumas partes foram desenvolvidas usando JSF 1.1, estas partes eu me preocupei ao máximo manter a compatibilidade com o menor número de alterações possível. Antes de ter os recursos de mensagens centralizados, eu não me preocupei em manter um padrão de nomenclatura para os recursos de mensagem, meu grande erro. Conclusão, meu recurso de mensagens para o cadastro de clientes se chamava… tente adivinhar… cliente.

Como a minha humilde caixa de seleção vinculava seu valor a uma propriedade chamada cliente, começaram as dores de cabeça. Eu recebi uma exception não muito amistosa:

19/05/2008 23:06:40 javax.faces.component.UIInput updateModel
SEVERE: /contatos/contato.xhtml @44,46 value=”#{Contato.cliente}”: {0} object is read only base com.marcossousa.app.beans.ContatoBean@123efed property cliente
19/05/2008 23:06:40 com.sun.faces.lifecycle.RenderResponsePhase execute
INFO: WARNING: FacesMessage(s) have been enqueued, but may not have been displayed.
sourceId=myform:cliente[severity=(ERROR 2), summary=(/contatos/contato.xhtml @44,46 value="#{Contato.cliente}": {0} object is read only base com.marcossousa.app.beans.ContatoBean@123efed property cliente), detail=(/contatos/contato.xhtml @44,46 value="#{Contato.cliente}": {0} object is read only base com.marcossousa.app.beans.ContatoBean@123efed property cliente)]

Logo que ocorreu o problema fui verificar se o método Set do meu bean estava correto e verifiquei também se o Contato não era nulo. Tudo estava aparentemente correto, pesquisei sobre o assunto no “Oráculo” e não encontrei nenhuma informação relevante. Mais algum tempo de análise verificando se havia alguma correlação, e nada, mas estava chegando perto.

Vendo que eu iria perder muito tempo, tomei uma decisão: vou executar a aplicação usando os códigos fontes do JSF. Coloquei um breakpoint no código que seta os valores nas propriedades dos Managed Beans. Analisei os comportamentos durante cada chamada. Uma coisa não fazia sentido, era verificada a existência de um recurso de mensagens para cada propriedade. Restaurei os códigos fontes também da API para confirmar minhas suspeitas. E realmente e retornava o recurso de mensagens.

Apesar do tempo perdido, foi interessante resolver o problema. Espero que ajude alguém. Recapitulando:

<resource -bundle>
<base -name>com.foo.message</base>
<var>mymessage</var>
</resource>

public class Foo {
private String mymessage;
privates String getMymessage() {
return mymessage;
}
private void setMymessage(String s) {
this.mymessage=s
}
}

E

<h :inputText value="#{foo.mymessage}"/>

Não funciona!

Está aí uma grande vantagem de usar bibliotecas open-source, o problema é complexo, melhor olhar diretos nos fontes! Eu adoro fazer isto =)

Comments
2 Comments »
Categories
Artigos, cinema, Hibernate, Java, Java EE, Java Server Faces, Spring, Vídeo Aulas
Tags
JSF, JSF 1.2, message bundle, propriedade, resource bundle, {0} object is read only base
Comments rss Comments rss
Trackback Trackback

Seam – Getting started: Converters!

Marcos Sousa | May 16, 2008

Na série de vídeo-aulas que eu fiz para o portal DevMedia sobre o Seam Framework, eu mostrei como podem ser usadas as anotações para registro de Conversores JSF. A notação é bastante simples. Imagine que você tenha um cadastro de produtos.

Veja o código do conversor:

@Name("productConverter")
@BypassInterceptors
@Converter(forClass=Product.class)
public class ProductConverter implements javax.faces.convert.Converter{

public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
// Insira o código que transforme a string no objeto desejado (Product)
}

public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
// Insira o código que transforme o objeto desejado (Product)    em String
}

}  

Para registrar um conversor temos que usar as anotações:
@Name – Registra o conversor como um componente Seam
@BypassInterceptors – Indica que o conversor não deve sofrer ação dos intercetadores SEAM.
@Converter – Registra o conversor no contexto JSF, o atributo forClass indica a classe que iremos converter.

Também poderíamos cria o conversor usando um identificador, porém eu fiz alguns testes e para determinados comportamentos são gerados erros relacionados ao controle de estado. Se você também teve estas experiências, compartilhe-as!

Comments
4 Comments »
Categories
Java, Java EE, Java Server Faces, Jboss Seam
Tags
GET, Java, Java Server Faces, Jboss Seam, JSF, Page Actions, Seam Framework
Comments rss Comments rss
Trackback Trackback

Brasileiros se destacam no JavaOne

Marcos Sousa | May 8, 2008

Lendo algumas notícias sobre o JavaOne 2008 eu vi um comentário colocando em evidência a participação brasileira no evento. Veja o comentário do James Gosling:

“I spent an hour with the Dutch JUG. It was great during the opening on Tuesday morning when John Gage made a comment about the Brazilians being uninhibited extroverts, and how the rest of the audience should be honorary Brazilians… About 80 members of the Dutch jug lept up with a huge banner and let out a roar that put the Brazilians to shame. There’s definitely some national competition brewing here.”

Bom não estamos em destaque sozinhos, os holandeses estão aí. Mas bem que eu gostaria de estar em San Francico para ajudar a fortalecer a comunidade brasileira.

Comments
No Comments »
Categories
Java
Tags
James Gosling, Java, JavaOne 2008
Comments rss Comments rss
Trackback Trackback

« Previous Entries

Núvens de tags

Agile Eventos Facelets GET Hibernate incompatiblidades Itext Java Java EE Java Magazine Java Server Faces JavaServer Faces Java Vídeo Magazine Jboss jboss-seam-itext Jboss Developer Studio Jboss Seam JDBC type: 7 JPA JSF linux mare marébh maré de agilidade Microsoft No Dialect mapping for JDBC type: 7 Page Actions PostGreSQL RHDS rich:fileUpload RichFaces Rich Faces RichFaces 3.2 Scrum Seam-gen Seam Framework Seam PDF Spring Spring Framework TDD URL Rewrite URL User Friendly Variable Resolver Vídeo Aula XP

Meus últimos tweets

  • Aos participantes do Bhjs que gostariam de vir para a Globo.com, segue as outras vagas http://t.co/KjBinf4x #bhjs #beagajs 1 week ago
  • Se você precisa buscar dado no disco, prefira assíncrona @luciano #bhjs #beagajs http://t.co/5gCHp7P8 2 weeks ago
  • @DouglasAguiar @HerberthAmaral Porque na copa? 2 weeks ago
  • Slides da palestra 'Indo além com jQuery' #bhjs #beagajs http://t.co/wHbhaI75 2 weeks ago
  • @araujolucas na parte da frente a temperatura está melhor 2 weeks ago
  • Começando a palestra do @cmilfont no #bhjs #beagajs http://t.co/9DZt7MQj 2 weeks ago
  • @isaias_barroso @DeivissonBruno @cmilfont gula ao extremo:) 2 weeks ago
  • Palestra com insights do desenvolvimento do paparazzo #gcom #bhjs #beagajs http://t.co/7igVbtmS 2 weeks ago
  • @flavio1110 energético? 2 weeks ago
  • Alguém indo do Aeroporto de Confins para centro/guitierrez por voltar de 12:00 #bhjs #beagajs 2 weeks ago

Anúcios

Categorias

  • .net
  • Agile
  • Agile Conference 2009
  • Artigos
  • Atualidades
  • c++
  • cinema
  • Django
  • DRY
  • Eventos
  • Flex
  • Formula 1
  • Hibernate
  • IDE
  • Inutilidades
  • Java
  • Java EE
  • Java Server Faces
  • Jboss Seam
  • linux
  • Mac OS
  • Microsoft
  • Open-source
  • Palestras
  • Python
  • RAD
  • RIA
  • RichFaces
  • Scrum
  • Software Livre
  • Spring
  • Spring Annotations
  • TDD
  • Testes
  • Uncategorized
  • Vídeo Aulas

Links recomendados

  • AJ Soluções
  • Ary Júnior
  • Erko Bridee
  • Fragmental
  • Fragmental TW
  • Guilherme Chapiewski
  • Handerson Frota
  • Jeveaux
  • Juliano Carniel
  • Onipresente
  • Passes de Letra
  • PortalJava.com
  • Rafael Carneiro
  • Rafael Pontes

DevMedia Post’s

Get Adobe Flash playerPlugin by wpburn.com wordpress themes
rss Comments rss valid xhtml 1.1 design by jide powered by Wordpress get firefox