Problema Hibernate + Spring + JSF [RESOLVIDO]

Boa tarde pessoal!

Eu estou começando agora a usar JSF (na verdade sou novo em Java) e estou com um problema que não consegui resolver…

Estou fazendo uma aplicação muito simples de cadastro de contatos só pra aprender a usar Hibernate, Spring e JSF juntos…

Minha página mostra os meus contatos já cadastrados num datatable, possui os campos de imputtext pra digitar as informações e um botão que chama o método criarContato… só que logo quando eu entro na minha página aparece no meu console do Tomcat:

[code]15/06/2006 10:14:42 org.springframework.jdbc.datasource.JdbcTransactionObjectSupport

INFO: JDBC 3.0 Savepoint class is available

15/06/2006 10:14:43 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions

INFO: Loading XML bean definitions from class path resource [org/springframework/jdbc/support/sql-error-codes.xml]

15/06/2006 10:14:43 org.springframework.jdbc.support.SQLErrorCodesFactory

INFO: SQLErrorCodes loaded: [DB2, HSQL, MS-SQL, MySQL, Oracle, Informix, PostgreSQL, Sybase]
[/code]

A página entra, os meus contatos aparecem no datatable mas quando eu digito os dados e clico no botão pra chamar o método criarContato, nada acontece… nem uma mensagem de erro ou qq coisa parecida aparece no console do Tomcat…

Alguém tem uma idéia do que pode estar acontecendo ?

Estou usando o MySQL 5.0, Hibernate 3 e Spring 2.0 M5

Muito Obrigado

Douglas Grava

coloca o código da página aqui pra nois da uma olhadinha :smiley:

E aí Rodrigo! Sou eu quem estava mandando aquelas dúvidas pra vc!

Segue o código da minha página contato.jsp:


<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	

	<title>My JSF 'Contato.jsp' starting page</title>

	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
</head>
  
<body>
	<f:view>
			<h:panelGrid id="panelContato" columns="8">
				<h:outputText value="id"></h:outputText> 
				<h:inputText id="ID" value="#{contatoManaged.contato.id}"></h:inputText>
				<h:outputText value="Nome"></h:outputText> 
				<h:inputText value="#{contatoManaged.contato.nome}"></h:inputText>
				<h:outputText value="Apelido"></h:outputText>
				<h:inputText value="#{contatoManaged.contato.apelido}"></h:inputText>
				<h:outputText value="Telefone"></h:outputText>
				<h:inputText value="#{contatoManaged.contato.telefone}"></h:inputText>
				<h:commandButton value="Salvar" action="#{contatoManaged.salvarContato}" />
				<br><br>
			</h:panelGrid>
			
			<h:panelGrid id="panelListaContatos" columns="1">
				
				<h:outputText value="Lista de Contatos" />
				<br><br>
				<h:dataTable var="contato" value="#{contatoManaged.contatos}" rows="3">
					<h:column>
						<f:facet name="header">
							<h:outputText value="Nome" />
						</f:facet>
						<h:outputText value="#{contato.nome}" />
					</h:column>
					<h:column>
						<f:facet name="header">
							<h:outputText value="Apelido" />
						</f:facet>
						<h:outputText value="#{contato.apelido}" />
					</h:column>
					<h:column>
						<f:facet name="header">
							<h:outputText value="Telefone" />
						</f:facet>
						<h:outputText value="#{contato.telefone}" />
					</h:column>
										
				</h:dataTable>
			
			</h:panelGrid>
			<br>
	</f:view>
</body>
</html>

Eu procurei por esse erro no google mas não encontrei uma resposta satisfatória… vou colocar tb meu managed Bean :


public class ContatoManaged {

	public ContatoManaged() {}
	
	private Contato contato = new Contato();
	private GerenciaContatos gerenciaContatosManager;

	public void setGerenciaContatosManager(GerenciaContatos gerenciaContatosManager) {
		this.gerenciaContatosManager = gerenciaContatosManager;
	}

	public GerenciaContatos getGerenciaContatosManager() {
		return gerenciaContatosManager;
	}

	public List getContatos(){
		return this.gerenciaContatosManager.getContatos();
	}
	
	
	public Contato getContato() {
		return contato;
	}

	public void setContato(Contato contato) {
		this.contato = contato;
	}
	
}

Meu faces-config.xml está dessa forma:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">

<faces-config>

        <!-- Allows you to inject Spring beans into JSF managed beans... -->
    <application>
        <variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver>
    </application>
    
    <managed-bean>
        <managed-bean-name>contatoManaged</managed-bean-name>
        <managed-bean-class>br.com.contato.backing.ContatoManaged</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
        <managed-property>
            <property-name>gerenciaContatosManager</property-name>
            <property-class>br.com.contato.business.GerenciaContatos</property-class>
            <value>#{gerenciaContatosManager}</value>
        </managed-property>
    </managed-bean>
    
    <navigation-rule>
    	<from-view-id>/Contato.jsp</from-view-id>
    </navigation-rule>
</faces-config>

E o meu applicationContext.xml:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans> 
		
	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName">
			<value>org.gjt.mm.mysql.Driver</value>
		</property>
    	<property name="url">
    		<value>jdbc:mysql://localhost:3306/artfesta</value>
    	</property>
    	<property name="username">
    		<value>root</value>
    	</property>
    	<property name="password">
    		<value>admin</value>
    	</property>
	</bean>
	
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
       <property name="dataSource"> 
          <ref bean="dataSource"/> 
        </property> 
        <property name="mappingResources"> 
          <list> 
            <value>br/com/contato/beans/Contato.hbm.xml</value>
          </list> 
        </property> 
        <property name="hibernateProperties"> 
           <props> 
             <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
           </props> 
        </property> 
    </bean> 
    
    <bean id="contatoDao" class="br.com.contato.DAO.Impl.ImplContatoDAO">
    	<property name="sessionFactory">
    		<ref bean="sessionFactory"/>
    	</property> 
  	</bean>
  	
  	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory">                                  
	    	<ref bean="sessionFactory"/>
	  	</property>
	</bean> 
	
		 
	<bean id="gerenciaContatos" class="br.com.contato.business.GerenciaContatos">
    	<property name="contatoDao">
    		<ref bean="contatoDao"/>
    	</property>
  	</bean>
  	
	
  	<bean id="gerenciaContatosManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
       <property name="transactionManager"> 
           <ref bean="transactionManager"/> 
       </property> 
       <property name="target"> 
           <ref bean="gerenciaContatos"/> 
       </property> 
       <property name="transactionAttributes"> 
           <props> 
             <!--  <prop key="salvar*">PROPAGATION_REQUIRED</prop> 
              <prop key="remover*">PROPAGATION_REQUIRED</prop> -->  
              <prop key="*">PROPAGATION_REQUIRED</prop> 
           </props> 
       </property>
    </bean>   
   
</beans>

E a minha classe que contém o método pra salvar o contato:


public class GerenciaContatos {
	
	private ContatoDAO dao;

	public void setContatoDao(ContatoDAO dao) {
		this.dao = dao;
	}
	
	public List getContatos(){
		return dao.getContatos();
	}
	
	public Contato salvarContato (Contato objContato){
		dao.salvarContato(objContato);
		return objContato;
	}
	
	public void removerContato (Contato objContato){
		dao.removerContato(objContato);
	}
	
	public Contato getContato(Long contatoId){
		return dao.getContato(contatoId);
	}
	
}

Esse erro tb acontece em um projeto de exemplo que eu peguei (hibernate + spring + jsf tb…)… logo quando eu entro na página, aparece a mesma mensagem no console do Tomcat… nos dois eu estou usando o MySQL 5…

Muito Obrigado!

Douglas Grava

tu esqueceu de colocar um h:form
ou seja, teus componentes não estão em formulário nenhum.

Valeu Rodrigo! Era isso mesmo pra esse problema! :smiley:

Mas agora quando eu clico no botão pra salvar aparece :


javax.servlet.ServletException: No bean named 'jsfNavigationHandler' is defined
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:209)


root cause 

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'jsfNavigationHandler' is defined
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:318)
	org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:778)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:171)
	org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:611)
	org.springframework.web.jsf.DelegatingNavigationHandlerProxy.getDelegate(DelegatingNavigationHandlerProxy.java:130)
	org.springframework.web.jsf.DelegatingNavigationHandlerProxy.handleNavigation(DelegatingNavigationHandlerProxy.java:109)
	com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:89)
	javax.faces.component.UICommand.broadcast(UICommand.java:312)
	javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:267)
	javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:381)
	com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:75)
	com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:90)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)

Eu procurei no google mas não achei nada sobre esse erro… O que pode ser ? Que dizer que eu preciso definir alguma navegação pra quando eu clicar no meu botão salvar ? Mas eu só quero que quando eu clicar no botão Salvar ele mostre o novo contato no datatable…

Valeu!!

Douglas Grava

Você definiu lá no botão que quando ele for clicado ele vai chama um método salvarContato lá no managed bean de contatos, mas não existe esse método no seu managed bean.

Ele provavelmente seria algo parecido com isso:


public String salvarContato() {
      this
            .gerenciaContatosManager
            .salvarContato(this.getContato()); //salvando o contato atual
     this.setContato(new Contato()); //colocando um novo contato no formulário
     return null; //mandando o JSF mostrar a mesma página denovo

}

[quote=dgrava]Valeu Rodrigo! Era isso mesmo pra esse problema! :smiley:

Mas agora quando eu clico no botão pra salvar aparece :


javax.servlet.ServletException: No bean named 'jsfNavigationHandler' is defined
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:209)


root cause 

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'jsfNavigationHandler' is defined
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:318)
	org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:778)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:171)
	org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:611)
	org.springframework.web.jsf.DelegatingNavigationHandlerProxy.getDelegate(DelegatingNavigationHandlerProxy.java:130)
	org.springframework.web.jsf.DelegatingNavigationHandlerProxy.handleNavigation(DelegatingNavigationHandlerProxy.java:109)
	com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:89)
	javax.faces.component.UICommand.broadcast(UICommand.java:312)
	javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:267)
	javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:381)
	com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:75)
	com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:90)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)

Eu procurei no google mas não achei nada sobre esse erro… O que pode ser ? Que dizer que eu preciso definir alguma navegação pra quando eu clicar no meu botão salvar ? Mas eu só quero que quando eu clicar no botão Salvar ele mostre o novo contato no datatable…

Valeu!!

Douglas Grava
[/quote]
Este erro provavelmente é por que você copiou o exemplo que fiz para o evento da devmedia, alterou para usar XML mas manteve os jars do projeto spring-annotation no seu projeto.
ou seja, não esta habilitado o loading dos componentes destes JARs via scanning de annotations, e eles também não estão sendo carregados via XML, mas nestes JARs existem arquivos faces-config.xml, que esperam que existam os beans configurados no spring.
a forma mais fácil de resolver é removendo os jars do spring-annotation, ja que eles não estão sendo utilizados mesmo :smiley:

Era isso mesmo Rodrigo! Eu estava com os dois pacotes do seu spring-annotatios na lib do meu projeto exemplo… agora resolveu-se tudo!! :smiley:

Agora já da pra completar o meu projeto exemplo! Valeu a ajuda de todos!

Quando vc conseguir disponibilizar os exemplos do uso do spring-annotations eu vou tentar implementar nesse projeto tb junto com as annotations do hibernate.

Abraços!

Douglas Grava