JSF Converter. [resolvido - usando outra estrategia]

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…

:confused:

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 :slight_smile:
preste um pouco mais de atenção.

A solução está aqui: http://www.guj.com.br/java/287356-converter-como-um-managedbean#1519431