JSF Converter e Spring, JPA, Hibernate

Boa tarde pessoal tudo bem?
Estou com meu primeiro projeto utilizando JSF, Spring e estou me deparando com um problema no uso dos Converter, dentro de um Converter estou utilizando o getHibernateTemplate.find(“from Funcionario where codigo=?”, codigoFuncionario) mas me parece que o Spring não está conseguindo realizar seu papel neste caso o que devo fazer ? Acredito que não estou recebendo um Session do Spring…

obs. Como estou aprendendo essa nova arquitetura JPA, Spring… Posso ter falado alguma besteira me corrijam…

Obrigado.

Qual é o erro que está acontecendo?

Eu tenho um código muito parecido com isso que funciona normalmente.

Olá Mauricio o meu converter está desta maneira:

package br.com.fato.juridico.converter;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import br.com.fato.juridico.bean.Estado;

public class EstadoConverter extends HibernateDaoSupport implements Converter {

	public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) throws ConverterException {

		Estado estado = null;
		try {	
			//estado = (Estado) getHibernateTemplate().get(Estado.class, arg2);
			estado = (Estado) getHibernateTemplate().find("from Estado where codigoEstado=?", arg2);
			
			System.out.println(estado.getNomeEstado());
			
		} catch (Exception e) {
			System.out.print(e.getMessage());
		}

		return estado;
	}

	public String getAsString(FacesContext arg0, UIComponent arg1, Object object) throws ConverterException {
		if (object == null) {
			return String.valueOf("");
		}
		return object.toString();
	}

}

No meu Bean Estado sobrescrevi o toString para exibir o atributo codigoEstado e reparei q no momento da execucaco do converter no console é exibido um: nullHibernate

O seu Converter não deveria herdar de HibernateDaoSuport, ele deveria ter acesso a um objeto que herde de HibernateDaoSuport e que esteja no contexto do Spring.

Ola Mauricio e pessoal, olha coloquei no meu EstadoServiceImpl o metodo:

	public Object carregar(String codigo) {
        Estado estado = (Estado) getHibernateTemplate().get(Estado.class, codigo);
        if (estado == null) {
            throw new ObjectRetrievalFailureException(Cliente.class, codigo);
        }
        return estado;
	}

Essa minha classe está informada no applicationContext.xml mas pelo q eu estou vendo nao está nem sendo chamado pelo converter.

    <bean id="estadoService" parent="txProxyTemplate">
        <property name="target">
            <bean class="br.com.faro.juridico.service.EstadoServiceImpl">
                <property name="estadoDAO">
                	<ref bean="estadoDao"/>
                </property>
            </bean>
        </property>
    </bean>	

alguém possui uma sugestão :frowning:

Estive verificando e pelo que entendi o Spring está injetando o session após a minha tentativa de recuperar o objeto Estado, existe alguma maneira de consertar isso ?

Meu Bean está definido assim:

    <bean id="estadoService" parent="txProxyTemplate">
        <property name="target">
            <bean class="br.com.faro.juridico.service.EstadoServiceImpl">
                <property name="estadoDAO">
                	<ref bean="estadoDao"/>
                </property>
            </bean>
        </property>
    </bean>	

Na minha classe utilitaria o metodo setEstadoService está sendo executado após o getEstado que precisa da session pra fazer a busca.

public class EstadoWeb {

	private EstadoService mgr = null;
	
	public void setEstadoService(EstadoService estadoService) {
		this.mgr = estadoService;
	}
	
	public TreeMap getListaEstados() {
		return mgr.listaEstados();
	}
	
	public Estado getEstado(String codigo){
		return mgr.getEstado(codigo);
	}
	
}

Bom consegui resolver em termos o problema, peguei atravez do facesContext a minha classe que estava com a sessão injetada dessa maneira consegui fazer ele pesquisar o objeto com sucesso, mas ainda continua dando o problema de Not Valid

alguém tem idéia do q está ocorrendo?

Que problema de not valid é esse?

Mauricio como vc havia me recomendado em um post anterior, criei um metodo dentro de uma classe que recebia a session do spring para recuperar a classe e persistir.

Então fiz isso da seguinte maneira no meu Converter:

	public Object getAsObject(FacesContext facesContext, UIComponent arg1,
			String arg2) throws ConverterException {
		
		Long codigo = new Long(arg2);
		SegmentoWeb segmentoWeb = (SegmentoWeb) facesContext.getApplication().getVariableResolver().resolveVariable(facesContext, "Segmento");
		Segmento segmento = (Segmento) segmentoWeb.carregaSegmento(codigo);

		return segmento;
	}

Mas quando realizo um Submit na pagina, o Converter consegue recuperar as informações do BD, mas exibe na pagina o erro: Validation Error: Value is not valid

Rapaz, nunca vi isso, mas se ele está dando erro de validação, será que não é outra validação que você configurou não?