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!!