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

Anotando beans no Spring 2.5

Java EE, Spring 3 Comments »

Uma das mudanças principais do Spring 2.5 foi a inclusão de anotações. Mas como anotar um bean no Spring 2.5? Como ele será automaticamente adicionado no contexto Spring? Estas são algumas perguntas que venho recebendo com freqüência por e-mails e vendo em listas de discursão.

Bom para anotar um bean basicamente há 3 anotações: @Service, @Repository e @Controller. Você pode ou não especificar um nome para seu bean. Caso você não especifique ele irá considerar o nome da classe sendo o nome do seu bean. Veja um exemplo:


@Service("mycarService")
public classe CarService {
// algum código aqui
}

Você pode está ser perguntando, mas qual a diferença e qual anotação usar para anotar meus beans? Bom segundo a documentação do Spring Framework é aconselhável que use a anotação @Repository para beans de acesso a dados (DAO), @Service para lógica de negócio e @Controller para beans que fazer o controle web.

Ainda falta responder a uma pergunta:  Como ele será automaticamente adicionado no contexto Spring? São exigidos dois passos no arquivo de configuração, o primeiro é habilitar o uso de anotações e o outro é dizer em quais pacotes estão os beans anotatos, veja um exemplo:


<!-- Faz a indentificação dos beans anotados com @Service, @Repository e @Controller -->
<context:component-scan base-package="com.marcossousa.myblog"/>
<!-- Habilita a configuração de beans via anotações -->
<context:annotation-config/>

Com isto todos os beans antotados no pacote com.marcossousa.myblog serão adicionados automaticamente no contexto do spring. Fácil não?

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

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

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

Foi publicada no portal Java Magazine a 6ª vídeo aula da série sobre JBoss Seam. Nesta vídeo aula eu mostrei como é feita a integração entre o Seam e o Spring Framework.

O fato do Seam suportar a injeção de objetos presentes no contexto JSF permite que os beans declarados com contexto do Spring sejam facilmente consumidos pelos componentes Seam. Aí surgiria um problema, como fazer os beans presentes no contexto Spring ficar disponíveis no contexto JSF? Simples, o Spring possui um VariableResolver que disponibiliza os beans existentes dentro do contexto Spring.
Download dos Fontes Vídeo Aula
Vídeo Aula

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