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

Artigos, Hibernate, Java, Java EE, Java Server Faces, Spring, Vídeo Aulas, cinema 2 Comments »

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 =)

J2EE Spider: Rad brasileiro para Web!

Hibernate, Java, Java Server Faces, Open-source, RAD No Comments »

J2EE Spider é uma ferramenta open-source brasileira para desenvolvimento rápido de aplicações web baseadas em formulários. Conforme matéria disponibilizada site InfoQ, o J2EE Spider tem como funcionalidades:

- Interface visual para geração de código.
- Suporte a builds incrementais.
- Suporte a Round-trip
- O código gerado pode ser internacionalizado.
- Suporte a alguns frameworks.

Tem suporte a templates, através do SiteMesh e Facelets (para JSF), o suporte a persistência é feito através do hibernate e tem suporte a injeção de dependência usando Spring.

Links para download:
Instalador Windows
Multi-Plataforma

Vídeo Aula Jboss Seam: Integração Spring parte 2

Hibernate, Java, Java Server Faces, Jboss Seam, Spring, Vídeo Aulas No Comments »

Foi publicada no portal Java Magazine a 7ª vídeo aula da série sobre JBoss Seam. Nesta vídeo aula eu continuei mostrando os passos para a integração entre o Seam e o Spring Framework.

Como havia dito no post anterior, o Seam suporta a injeção de objetos presentes no contexto JSF. Nesta vídeo aula foi mostrado como configurar o components.xml, VariableResolver do Spring e criado um bean de persistência de usuários para persistir usuários.

Download dos Fontes Vídeo Aula
Vídeo Aula

No Dialect mapping for JDBC type: 7

Hibernate, Java No Comments »

This is one exception that can occur one day when you are using Hibernate and PostgreSQL. Basically it occur when you have an entity that has one float mapped property and you create one HQL query using the HQL built-in-functions, such as: SUM, AVG, COUNT, with left outer joins or simple queries.

org.hibernate.MappingException: No Dialect mapping for JDBC type: 7

There are two ways to solve the problem: the first is to change property type to Double and the second is to create a customized dialect:


public class PostgreSQLDialect extends org.hibernate.dialect.PostgreSQLDialect {

public PostgreSQLDialect() {
super();
registerColumnType(Types.REAL, “number($p,$s)” );
registerHibernateType(Types.REAL, “float”);
}

}

SQL type 7 corresponds to JDBC float type, then we need to register column data type and register hibernate data type too.

Portuguese version

WP Theme & Icons by N.Design Studio
Assine Assine os comentarios