Rafael Benevides bio photo

Rafael Benevides

In a serious relationship with Software Development

Email Twitter Facebook Google+ LinkedIn Instagram Github Last.fm Youtube

Depois de algum tempo sem falar, ou sequer trabalhar no XSeam, finalmente sobrou um pouco mais de tempo para falar dele neste Blog.

Um componente que foi adicionado na versão 0.6 (atualmente o XSeam está na versão 0.7) é o x:selectOneState e consequentemente o x:selectOneCity. Uma das motivações para cria-lo foi por quê esperara-se que organizações evoluidas possuam um esquema de dados (db schema) corporativo de onde espera-se que todas os sistemas façam uso destas tabelas e dados ditos corporativos.

Entretanto já tive o (des)prazer de trabalhar em corporações onde cada sistema possuia sua cópia da tabela de UF e Municípo. E para piorar cada uma de um jeito. Algumas o identificador era a própria sigla da UF, em outras era utilizado um auto-incremento, em outras o código do IBGE.

Como um dos objetivos do XSeam é ser um conjunto de componentes visuais e não visuais para o JBoss Seam Framework com foco em produtividade, mas também com foco em padronização, foi então desenvolvido os componentes de UF e Município que buscam estes dados (imutáveis pela sua natureza) em XMLs, além de serem integrados (o combo de municipio é automaticamenete atualizado ao se trocar a uf selecionada). O identificador escolhido para este componente é o código IBGE.

Sendo assim, a classe City e State que são retornadas pelos componentes podem ser utilizadas como relacionamento JPA com outras classes pois elas possuem a anotação @Embeddable. Desta forma podemos ter na entidade o seguintes atributos:

    
private State uf;
private City cidade;

E com isto será gerado no Banco de dados os seguintes campos na tabela da referida entidade: stateCode integer, cityCode integer.

Ou seja, desta forma você estará automáticamente guardando o código IBGE da UF e do Município na sua tabela. Entretando se você não quer utilizar os nomes sugeridos para a coluna, você pode fazer uso da anotação @AttributeOverride da seguinte maneira:

@AttributeOverride(name="id",column=@Column(name="uf"))
private State uf;
  
@AttributeOverride(name="id",column=@Column(name="cidade"))
private City cidade;

Desta maneira os atributos podem ser persistidos nas colunas de acordo com o nome definido na anotação.

Uma vez que o atributo está definido na entidade, agora é possível na nossa página usar os componentes de UF e Município da seguinte maneira:

<x:selectOneState value="#{personHome.instance.uf}" reRender="cidade"/>
<br />
<x:selectOneCity name="cidade" value="#{personHome.instance.cidade}" selectedState="#{personHome.instance.uf}" />

E assim será automaticamente renderizado os combos de UF e Município conforme figura abaixo:

O exemplo citado neste post está disponível na aplicação de Blueprint que está disponível na página de downloads no site do Xseam – https://github.com/rafabene/XSeam2

Outras postagens sobre o Xseam:

  1. Aumentando a produtividade com JSF e Jboss Seam – XSeam lançado!
  2. XSeam – i18n e Facelets Bug