Top Posts

X Sinform 2010 – UESC/Ilheus,BA – Eu estive lá

Continue lendo

Converter JSF com Spring

Posted by camilolopes | Posted in Java, JSF, Spring | Posted on 05-09-2013

0

 

Olá Pessoal,

O post de hoje será bem rápido. Se você está  precisando criar um Converter e fazer com que este seja gerenciado pelo Spring, o que fazer? Ao olhar a documentação do Spring não há nenhuma anotação direta para o Converter. Lets go! Vamos ver na prática como fazer isso…

 

Converter

Um resumo rápido: Sabemos que quando precisamos carregar um selectOneMenu, por exemplo, um valor customizado, é preciso ter um converter, como por exemplo se preciso carregar cidade, estado, status,  etc é necessário ter um converter, e para implementarmos um converter temos que criar uma classe que implementa a interface Converter do JSF. Nada de especial até aqui, certo?

@FacesConverter( value= “com.camilolopes.readerweb.TypeConverter”,forClass=Type.class)

public class TypeConverter implements Converter {

       @Override

public Object getAsObject(FacesContext context, UIComponent component, String value) {

 

return null;

       } 

       @Override

public String getAsString(FacesContext arg0, UIComponent arg1, Object value) {

             

return null;

       } 

}

Mas você está usando o Spring e quer que seu Converter seja gerenciado por ele, e ainda assim poder chamar as classes de serviços, como fazer? Veja o código alterado com Spring e chamando um método na classe de serviço: 

@Component(“typeConverter”)

public class TypeConverter implements Converter {

       @Autowired

       private TypeServiceImpl typeServiceImpl;

       @Override

public Object getAsObject(FacesContext context, UIComponent component, String value) { 

              Type type = typeServiceImpl.searchById(Long.valueOf(value));

              return type;

       } 

       @Override

       public String getAsString(FacesContext arg0, UIComponent arg1, Object value) {

                     if(value!=null){

                           return ((Type)value).getId().toString();

                     }

              return null;

       } 

       public TypeServiceImpl getTypeServiceImpl() {

              return typeServiceImpl;

       } 

       public void setTypeServiceImpl(TypeServiceImpl typeServiceImpl) {

              this.typeServiceImpl = typeServiceImpl;

       } 

}

Basta anotar com @Component e definir um id para o converter. Na página XHTML chamaremos o id usando EL, veja:

<p:selectOneMenu value=“#{userController.selectedType}” converter=“#{typeConverter}”>

<f:selectItems  itemLabel=“#{type.description}” itemValue=“#{type}” var=“type”  value=“#{typeController.listTypes}” />

</p:selectOneMenu>

Pronto, assim temos o converter via Spring. Claro que você precisar ter no seu face-config.xml na tag <application />

<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>

 Dizendo para o JSF que o Spring vai cuidar da instanciação dos objetos etc. Veja nesse post.

Por hoje é isso. See ya!!

Internacionalização sua aplicação com JSF

Posted by camilolopes | Posted in Java, JSF | Posted on 30-08-2013

3

Olá Pessoal,

No post de hoje veremos como internacionalizar nossa aplicação JSF.  Eu acho o suporte de internacionalização do JSF muito simples e fácil. É comum você trabalhar em um projeto e o cliente falar que deseja dar suporte pelo menos a 2 idiomas: um default e +1. Veremos como preparar nossa aplicação para isso. Lets go…

Starting…

O JSF procura os arquivos de tradução em um local, que é dentro de resources / src/main/resources, então é lá que vamos colocar os .properties para cada idioma que a aplicação vai suportar. No exemplo aqui será português e inglês, portanto crie dois arquivos .properties chamado: language_en_US e language_pt_BR.  O nome language pode ser qualquer outro. O que teremos nele? Como qualquer arquivo de properties um key=value, é nele que vamos colocar a tradução da aplicação dos labels, message etc. Dentro de src/main/resources crie o seguinte package: com/camilolopes/readerweb/idiom, é onde ficarão nossos arquivos .properties. Poderia deixar na raiz, mas quis colocar em package para ficar organizado.

 

jsfinterproperties

Feito isso, abra o seu face-config.xml e faça isso dentro de application:

<locale-config>

   <default-locale>pt_BR</default-locale>

   <supported-locale>pt_BR</supported-locale>

   <supported-locale>en_US</supported-locale>

  </locale-config>

  <!– Local where is .properties –>

  <resource-bundle>

       <base-name>com.camilolopes.readerweb.idiom.language</base-name>

       <!–  variable will be used in system of context –>

       <var>language</var>

  </resource-bundle>

 

Observe que criamos uma variável. É ela que vamos usar no XHTML passando o key do .properties para que possa ser traduzido com base no idioma definido no browser.

Colocando tradução no .properties

Eu particularmente gosto muito do plugin Resource Bundle http://sourceforge.net/projects/eclipse-rbe/ , pois ele me permite de uma única vez atualizar os dois arquivos  .properties, já inserindo a tradução, veja:

 

jsfpropertiesbundle

Se você usa o Eclipse é só instalar o plugin, mas ele não está no Eclipse Market, é old school, ou seja, você vai na pasta plugin do seu eclipse e cola todo o conteúdo de plugin que está no resource bundle que você acabou de baixar.

Usando na Prática

<h:outputLabel value=“#{language[‘label.type.description’]}” for=“name” />

<h:commandButton value=“#{language[‘command.save’]}” />

 

Resultado:

jsfinterlabelenglish

 

jsfinterlabelpt

Simples, não? Conheça API I4JSF

Espero que tenham gostado. See ya!!!

Abraços.