Estou tentando criar um converter genérico, mas o meu método com @PostConstruct não é chamado.
public abstract class BaseConverter<T, PK extends Serializable> implements Converter {
private BaseService<T, PK> baseService;
private Class<T> entityClass;
public BaseConverter(){}
public BaseConverter(BaseService<T, PK> baseService, Class<T> entityClass){
this.baseService = baseService;
this.entityClass = entityClass;
}
@SuppressWarnings("unchecked")
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
return this.getBaseService().findOne((PK) new SimpleTypeConverter().convertIfNecessary(arg2, ReflectUtil.getPrimaryKeyField(this.getEntityClass()).getType()));
}
@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
return arg2 == null ? "" : arg2.toString();
}
//getters and setters
}
Here the impl:
@FacesConverter(value = "grupoConverter")
public class GrupoConverter extends BaseConverter<Grupo,Integer>{
@Autowired
private GrupoService grupoService;
public GrupoConverter(){}
//como este método não é chamado, quando o método no baseConverter é chamado, recebo um NULL POINTER.
@PostConstruct
public void init(){
super.setEntityClass(Grupo.class);
super.setBaseService(grupoService);
}
}
Alguma ideia de como contornar este problema?
Se eu não me engano, pelo menos utilizando o CDI como framework de DI, o converter não é um objeto gerenciado pelo container, logo injeções e outras anotações que não pertençam ao JSF não são interpretadas. No caso do CDI o Seam Faces resolve, agora no seu caso, acredito que seja Spring, eu não sei qual seria a solução.
Para que complicar o desnecessario joga as linhas
super.setEntityClass(Grupo.class);
super.setBaseService(grupoService);
para o construtor companheiro e para de quebra a cabeça, para que complicar nesse ponto descomplique a tua aplicação, jogo no construtor isso, o teu servico generico inclusive tem un construtor que recebe esses dois parametros e voce ai querendo complica algo desnecessario passa isso no construtor e projeto para a frente cara …
[quote=CristianPalmaSola10]Para que complicar o desnecessario joga as linhas
super.setEntityClass(Grupo.class);
super.setBaseService(grupoService);
para o construtor companheiro e para de quebra a cabeça, para que complicar nesse ponto descomplique a tua aplicação, jogo no construtor isso, o teu servico generico inclusive tem un construtor que recebe esses dois parametros e voce ai querendo complica algo desnecessario passa isso no construtor e projeto para a frente cara …[/quote]
Infelizmente não é tão simples, pois se voce der um olhada o objeto grupoService é injetado no converter, como este não é passível de injeção este objeto seria nulo, logo envia-lo no contrutor não é uma solução viavel no contexto atual
O conceito esta errado o converter naum deveria conhecer nenhum serviço, eles devem ser coisas separadas, esse grupoService seria o que um ManagedBean, se ele for um managedBean o que falei é correto caso contrário desconsiderar o que eu falei…
da pra fazer isto:
public GrupoConverter(){
GrupoService grupoService = (GrupoService) ApplicationContextUtils.getApplicationContext().getBean(GrupoService.class);
super.setEntityClass(Grupo.class);
super.setBaseService(grupoService);
}
vou testar aqui agora
da onde é essa classe ApplicationContextUtils ?
Seria isto:
[code]
package br.com.noronha.model;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class ApplicationContextUtils implements ApplicationContextAware {
private static ApplicationContext ctx;
@Override
public void setApplicationContext(ApplicationContext appContext)
throws BeansException {
ctx = appContext;
}
public static ApplicationContext getApplicationContext() {
return ctx;
}
}[/code]
mas deu nullpointer:
SEVERE: Unable to load class:
java.lang.NullPointerException
at br.com.noronha.model.converter.converters.GrupoConverter.<init>(GrupoConverter.java:15)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at com.sun.faces.application.ApplicationImpl.newThing(ApplicationImpl.java:1729)
at com.sun.faces.application.ApplicationImpl.createConverter(ApplicationImpl.java:1332)
resolvi de outra maneira…

Então poste qual foi a solução, e marque o tópico como resolvido para que sirva de fonte de consulta pra outros.
[quote=cleciusjm]Então poste qual foi a solução, e marque o tópico como resolvido para que sirva de fonte de consulta pra outros.
[/quote]
eu já havia feito isto 
preste um pouco mais de atenção.
A solução está aqui: http://www.guj.com.br/java/287356-converter-como-um-managedbean#1519431