Problema com Spring 3 com JPA e JSF

Bom dia!

Pessoal sou bem Novo ( em Java ) venho do MS-VFP e para aprendizado estou desenvolvendo uma aplicacao bem simples
apenas com o intuito de me adequar a linguagem estou lendo bastante a respeito, vendo exemplos etc…
e pelo que li resolvi utilizar as tecnologias que estão dispostas no projeto ( pequeno projeto ) mais estou encontrando
um problema, o log do Apache não é tão claro pra mim tem muitas informações … mais percebo o problema so não
sei como resolver.

de Framework existente no projeto eu coloquei o JSF 2, Spring 3 e JPA o Container Tomcat 7
usando a IDE Eclipse Helios

Bem o problema é que o Bean não esta sendo criado, ou a variavel que ira receber o objeto entityManager…
o log do Tomcat me diz isto mais … olhei e não sei como resolver
porque ja olhei o codigo da minha classe que representa o Controller, do DAO e não sei o que pode estar errado.

Se alguem puder me dar uma dica … coloco as informações que disponho abaixo

Bem o Log do Tomcat me da este erro:
[EL Finest]: 2011-03-21 00:17:30.318–ServerSession(14211340)–Thread(Thread[Thread-1,5,main])–End predeploying Persistence Unit contatoSpringJpa; session file:/C:/Program Files/Apache Software Foundation/Tomcat 7.0/webapps/contatoSpringJpa/WEB-INF/classes/_contatoSpringJpa; state Predeployed; factoryCount 1
21/03/2011 00:17:30 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons
INFO: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@26c7da: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,statusDAOImpl,em,org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor#0,transactionManager,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor]; root of factory hierarchy
21/03/2011 00:17:30 org.springframework.web.context.ContextLoader initWebApplicationContext
GRAVE: Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘statusDAOImpl’: Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘em’ defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.reflect.UndeclaredThrowableException
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:341)

Bem abaixo tenho descrito como esta alguns arquivos que podem indicar o que estou fazendo de errado

Faces-Config.xml

<?xml version="1.0" encoding="UTF-8"?>

org.springframework.web.jsf.el.SpringBeanFacesELResolver

Obs este arquivo de configuracao do JSF achei estranho qdo fui colocar a Variavel RESOLVER da forma como li em um livro
a IDE me deu uma mensagem … e bem ficou desta forma como eu peguei aqui no Forum mais olhei a documentação do
spring e não achei nada a respeito.

o applicationContext.xml

context:annotation-config/
<context:component-scan base-package=“br.com.dominio.controller”/>
<context:component-scan base-package=“br.com.dominio.dao”/>
<context:component-scan base-package=“br.com.dominio.entidades”/>

<!-- Classe responsavel pela gestao das entidades  -->
<bean id="em"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="contatoSpringJpa" />
</bean>

<!-- Classe responsavel pela injecao do EntityManager nas classes
que usam a anotacoes @PersistenceContext -->
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

<!-- Classe responsavel pela gestao das transacoes  -->
<bean id="transactionManager"
  class="org.springframework.orm.jpa.JpaTransactionManager">
	<property name="entityManagerFactory" ref="em" />
</bean>

<!-- Marcacao de transacoes atraves de anotacoes  -->
<tx:annotation-driven />	

o arquivo java que representa o DAO ( StatusDAOImpl.java )
package br.com.dominio.dao;

import java.util.List;

import javax.persistence.*;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import br.com.dominio.entidades.Status;

@Repository
public class StatusDAOImpl implements StatusDAO {

 @PersistenceContext
  private EntityManager em ;
    
  public StatusDAOImpl() {
  }	
  
  @Transactional
  public void insert(Status status) {
    em.persist(status);
  }

  @Transactional
  public Status findByPK(Object id) {
    return em.find(Status.class, id);
  }
    
  @Transactional
  public void update(Status status) {
    em.merge(status);
  }
  
  @Transactional
  public void delete(Status status) {
    em.remove(status);
  }
    
  @Transactional
  public List<Status> findAll() {
    List<Status> result =
    	em.createQuery("SELECT p FROM Status").getResultList();
    return result;
  }

}

e por fim o meu controller ( StatusController.java )

package br.com.dominio.controller;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import org.springframework.transaction.annotation.Transactional;

import br.com.dominio.dao.StatusDAOImpl;
import br.com.dominio.entidades.Status;

@ManagedBean(name=“statusController”)
@ViewScoped
public class StatusController {

private StatusDAOImpl DAO;	
private Status status;
private DataModel model;

public String novoStatus() {
	this.status = new Status();
	return "novo";
}

public Status getStatus() {
	return status;
}

public void setStatus(Status status) {
	this.status = status;
}

@Transactional		
public DataModel getTodos() throws
    Exception {
	  model = new ListDataModel(DAO.findAll()) ;
	  return model;
}

@Transactional	
public String salvar() throws
    Exception {
	  if(status.getId()==null)
		  DAO.insert(status);
	  else
		  DAO.update(status);
	  return "sucesso";
}

public Status getStatusFromEditOrDelete( ) {
    status =
            (Status) model.getRowData( );
    return status;
}

@Transactional	
public String excluir( )
throws Exception {
    status = getStatusFromEditOrDelete( );
    DAO.delete(status);
    return "sucesso";
    
}

}

Bem Agradeço a quem puder me dar uma ajuda para que eu prossiga na proxima etapa da minha meta que é fazer as paginas

Robson Lira

Formate seu código usando as tags <code>,fica mais fácil pra gente te ajudar.

Opá Bom dia!

Caraca meu… sabe … eu nem me liguei nisto…
Vou fazer e envio novamente

Rafael meu prezado… vejo que qdo estou escrevendo … tem uma barra de ferramentas com botões
mais eu nunca usei isto não estou sabendo como usar este recurso Code ( Infelizmente )

mais vou tentar

Faces-Config.xml

Obs este arquivo de configuracao do JSF achei estranho qdo fui colocar a Variavel RESOLVER da forma como li em um livro
a IDE me deu uma mensagem … e bem ficou desta forma como eu peguei aqui no Forum mais olhei a documentação do
spring e não achei nada a respeito.

<?xml version="1.0" encoding="UTF-8"?>

<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">
    
   <application>
       <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
   </application>
   
 
</faces-config>

applicationContext.xml

  <context:annotation-config/>
  <context:component-scan  base-package="br.com.dominio.controller"/>
  <context:component-scan base-package="br.com.dominio.dao"/>
  <context:component-scan base-package="br.com.dominio.entidades"/>

    <!-- Classe responsavel pela gestao das entidades  -->
    <bean id="em"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            <property name="persistenceUnitName" value="contatoSpringJpa" />
    </bean>

    <!-- Classe responsavel pela injecao do EntityManager nas classes
    que usam a anotacoes @PersistenceContext -->
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
   
    <!-- Classe responsavel pela gestao das transacoes  -->
	<bean id="transactionManager"
	  class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="em" />
	</bean>
	
    <!-- Marcacao de transacoes atraves de anotacoes  -->
    <tx:annotation-driven />

o arquivo java que representa o DAO ( StatusDAOImpl.java )

package br.com.dominio.dao;

import java.util.List;

import javax.persistence.*;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import br.com.dominio.entidades.Status;

@Repository
public class StatusDAOImpl implements StatusDAO {

	 @PersistenceContext
	  private EntityManager em ;
	    
	  public StatusDAOImpl() {
	  }	
	  
	  @Transactional
	  public void insert(Status status) {
	    em.persist(status);
	  }
	
	  @Transactional
	  public Status findByPK(Object id) {
	    return em.find(Status.class, id);
	  }
	    
	  @Transactional
	  public void update(Status status) {
	    em.merge(status);
	  }
	  
	  @Transactional
	  public void delete(Status status) {
	    em.remove(status);
	  }
	    
	  @Transactional
	  public List<Status> findAll() {
	    List<Status> result =
	    	em.createQuery("SELECT p FROM Status").getResultList();
	    return result;
	  }

}

StatusController.java

package br.com.dominio.controller;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import org.springframework.transaction.annotation.Transactional;

import br.com.dominio.dao.StatusDAOImpl;
import br.com.dominio.entidades.Status;

@ManagedBean(name="statusController")
@ViewScoped
public class StatusController {
	
	private StatusDAOImpl DAO;	
	private Status status;
	private DataModel model;
	
	public String novoStatus() {
		this.status = new Status();
		return "novo";
	}
	
	public Status getStatus() {
		return status;
	}
	
	public void setStatus(Status status) {
		this.status = status;
	}

	@Transactional		
	public DataModel getTodos() throws
	    Exception {
		  model = new ListDataModel(DAO.findAll()) ;
		  return model;
	}

	@Transactional	
	public String salvar() throws
	    Exception {
		  if(status.getId()==null)
			  DAO.insert(status);
		  else
			  DAO.update(status);
		  return "sucesso";
	}
	
    public Status getStatusFromEditOrDelete( ) {
        status =
                (Status) model.getRowData( );
        return status;
    }
    
	@Transactional	
    public String excluir( )
    throws Exception {
        status = getStatusFromEditOrDelete( );
        DAO.delete(status);
        return "sucesso";
        
    }
    	
}

O erro que o log do Apache mostra é o Seguinte

[EL Finest]: 2011-03-21 00:17:30.318--ServerSession(14211340)--Thread(Thread[Thread-1,5,main])--End predeploying Persistence Unit contatoSpringJpa; session file:/C:/Program Files/Apache Software Foundation/Tomcat 7.0/webapps/contatoSpringJpa/WEB-INF/classes/_contatoSpringJpa; state Predeployed; factoryCount 1
21/03/2011 00:17:30 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons
INFO: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@26c7da: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,statusDAOImpl,em,org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor#0,transactionManager,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor]; root of factory hierarchy
21/03/2011 00:17:30 org.springframework.web.context.ContextLoader initWebApplicationContext
GRAVE: Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'statusDAOImpl': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'em' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.reflect.UndeclaredThrowableException
	at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:341)

Não sei no JSF 2,mas no JSF 1.2 o DAO que vc usa no Controller precisa estar anotado assim:

 public class StatusController {  
    @Resource  
     private StatusDAOImpl DAO; 

Pelo erro estou entendendo que você esqueceu de especificar na anotação @PersistenceContext qual a conexão JPA deve ser utilizada. Na anotação @PersistenceContext você deve passar como parâmetro o nome da conexão JPA especificada no persistence.xml.

Não entendi muito bem mais… isto eu coloquei no arquivo de configuracao do Spring
applicationContext.xml

   <bean id="em"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            <property name="persistenceUnitName" value="contatoSpringJpa" />
    </bean>

preciso entao fazer Nova referencia em outro lugar ao meu arquivo persistence.xml ???

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="contatoSpringJpa" transaction-type="RESOURCE_LOCAL">
		<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
		<properties>
			<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost/contato"/>
			<property name="javax.persistence.jdbc.user" value="postgres"/>
			<property name="javax.persistence.jdbc.password" value="12345"/>
			<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
           <property name="eclipselink.logging.level" value="ALL"/>		
		</properties>
	</persistence-unit>
</persistence>

Revendo o erro, me parece que ocorreu alguma exceção na inicialização no o entityManager mesmo. Não conheço o eclipse link, mas você já conferiu se não está faltando nenhum parâmetro?

Olha ja olhei, revisei, alterei… o problema mesmo acho que é a falta de experiencia ( Pra não dizer de conhecimento )
na linguagem.

Tudo o que eu fiz até agora foi lendo sabe… ai tenho que tentar recorrer a alguem que me dê uma dica porque cheguei
ai e parei, o log do tomcat também ( pra mim acho que pra alguem com conhecimento até que ele pode dizer algo )
mais pra mim eu nem sei pra onde vai.

Mais sera que não é algo no Web.xml ? la o que se refere ao Spring é o Seguinte

 <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/applicationContext*.xml</param-value>
 </context-param>
 <filter>
  <filter-name>openEntityManager</filter-name>
  <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
 </filter>
 <filter-mapping>
  <filter-name>openEntityManager</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

Ta faltando a porta do postgres,não??

Realmente não sei o que pode ser o erro. Uma abordagem que uso para resolver problemas com Spring é usar o Spring Roo para gerar código parecido com que o preciso e conferir se está tudo correto. É uma boa referência nesses casos.

Bem Obrigado pelos comentarios… estou olhando a documentação do Spring e ver se acho o problema

Comece pelo mais simples.

Vc consegue criar uma classe com um metodo main e conectar no banco com esses parâmetros? Acho q ta faltando a porta ai…

Corrigi a porta do banco que realmente estava faltando
mais o problema persiste e eu olhei a documentação do Spring ontem com calma e
realmente acho que ta tudo certo não sei o porque do erro no Tomcat

Fala ai…

Meu caso é um pouco diferente… usando as suas configurações… meu erro é diferente.

Porém eu uso o JBoss 4.2.

Usando JSF 2 e Spring 3 para IoC na camada Visao e Service funciona na boa… meu problema está ao mapear conexao com BD.

se alguem tiver alguma solução!

meu erro é

Caused by: java.lang.IllegalStateException: Cannot convert value of type [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean] to required type [javax.persistence.EntityManagerFactory] for property 'entityManagerFactory': no matching editors or conversion strategy found

Fala ai…

Meu caso é um pouco diferente… usando as suas configurações… meu erro é diferente.

Porém eu uso o JBoss 4.2.

Usando JSF 2 e Spring 3 para IoC na camada Visao e Service funciona na boa… meu problema está ao mapear conexao com BD.

se alguem tiver alguma solução!

meu erro é

Caused by: java.lang.IllegalStateException: Cannot convert value of type [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean] to required type [javax.persistence.EntityManagerFactory] for property 'entityManagerFactory': no matching editors or conversion strategy found