EntityManager como NullPointerException

JSF 2 + HIBERNATE 3 (JPA) + Spring 3 (Para controle de transação)

Pessoal… porque o Spring não esta injetando o EntityManager ?

web.xml (parte referente ao Spring)

...
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
   <listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
  </listener>
...

applicationContext.xml

...
     <tx:annotation-driven/>
	
	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">  
         <property name="entityManagerFactory" ref="entityManagerFactory"/>
     </bean>
     
     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost/fusionnet" />
        <property name="username" value="root" />
        <property name="password" value="" />
 	</bean>
	
	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="persistenceUnitName" value="fusionnet" />
		<property name="dataSource" ref="dataSource"/>
		 <property name="loadTimeWeaver">  
             <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />  
         </property>
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
			<property name="showSql" value="true" />
			<property name="generateDdl" value="true" />
			<property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
			</bean>
		</property>
	</bean>
     
     <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
     <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
...

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="fusionnet" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
  </persistence-unit>
</persistence>

DAO

@Transactional
public class DAO<T> {
	
	private final Class<T> classe;
	private EntityManager em;
	
	public DAO(Class<T> classe) {
		this.classe = classe;
	}

	@PersistenceContext
	public void setEm(EntityManager em) {
		this.em = em;
	}

	public void add(T t) {
		
		em.persist(t);
		
	}

	public void delete(T t) {
		
		em.remove(em.merge(t));
		
	}

	public void update(T t) {
		
		em.merge(t);
		
	}

	public List<T> listAll() {
		
		CriteriaQuery<T> query = em.getCriteriaBuilder().createQuery(classe);
		query.select(query.from(classe));
		List<T> lista = em.createQuery(query).getResultList();
		
		return lista;
	
	}

	public T listId(long id) {
		
		T t = em.find(classe, id);
		
		return t;
	
	}
}

Erro

java.lang.NullPointerException
	br.com.fusionnet.dao.DAO.listAll(DAO.java:51)
	br.com.fusionnet.mb.UfBean.getUfs(UfBean.java:31)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	javax.el.BeanELResolver.getValue(BeanELResolver.java:62)
	javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
	com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:71)
	org.apache.el.parser.AstValue.getValue(AstValue.java:123)
	org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
	com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:106)
	javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:190)
	javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:178)
	javax.faces.component.UISelectItems.getValue(UISelectItems.java:125)
	com.sun.faces.renderkit.SelectItemsIterator.initializeItems(SelectItemsIterator.java:198)
	com.sun.faces.renderkit.SelectItemsIterator.hasNext(SelectItemsIterator.java:131)
	com.sun.faces.renderkit.html_basic.MenuRenderer.renderOptions(MenuRenderer.java:758)
	com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:840)
	com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:294)
	javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:879)
	com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:308)
	com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:181)
	com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:125)
	javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:849)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:1643)
	javax.faces.render.Renderer.encodeChildren(Renderer.java:164)
	javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:849)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:1643)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:1646)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:1646)
	com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:389)
	com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:127)
	com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:117)
	com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
	com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:135)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:309)

Se adicionar a anotação @Repository e habilitar a procura de classes no applicationContext com as linhas a seguir acredito que funcione.

[code]<context:annotation-config />

<context:component-scan base-package=“br.com.xyz” />[/code]

E ai lsjunior…blz

Eu adicionei o @Repository na classe DAO e coloquei no applicationContext oque você falou:

  <context:annotation-config/>
  <context:component-scan base-package="br.com.fusionnet"/>

Agora ele esta apresentando outro erro. Esse erro já aparece quando starto o servidor.

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'DAO' defined in file [C:\Savio\Workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\Fusionnet\WEB-INF\classes\br\com\fusionnet\dao\DAO.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [br.com.fusionnet.dao.DAO]: No default constructor found; nested exception is java.lang.NoSuchMethodException: br.com.fusionnet.dao.DAO.<init>()
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:965)

Não pensei que fosse tão complicado fazer isso funcionar. :?

Savio, eu utilizo o spring 3 com hibernate 3.5 e jsf 2.0, tbm tive algumas dificuldades para configurar o spring no início.

aqui por exemplo se eu colocar LocalContainerEntityManagerFactoryBean não funciona, apenas se eu colocar LocalEntityManagerFactoryBean. Você pode tentar isso tbm :wink:
no meu caso fica assim:

&lt;bean id="entityManagerFactory"
		 class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"&gt;
		&lt;property name="persistenceUnitName" value="conexaoHibernate" /&gt;
	&lt;/bean&gt;

e o meu persistence.xml

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;persistence version="1.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_1_0.xsd"&gt;

	&lt;persistence-unit name="conexaoHibernate"&gt;

		&lt;provider&gt;org.hibernate.ejb.HibernatePersistence&lt;/provider&gt;
		
		&lt;properties&gt;
			&lt;property name="hibernate.archive.autodetection" value="class, hbm" /&gt;

			&lt;property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect" /&gt;
			&lt;property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /&gt;
			&lt;property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/meubanco" /&gt;
			&lt;property name="javax.persistence.jdbc.user" value="meuusuario" /&gt;
			&lt;property name="javax.persistence.jdbc.password" value="minhasenha" /&gt;
			
			&lt;!--Configuracoes de Debug --&gt;
			&lt;property name="hibernate.show_sql" value="true" /&gt;
			&lt;property name="hibernate.format_sql" value="true" /&gt;
			&lt;property name="use_sql_comments" value="true" /&gt;
			&lt;property name="hibernate.hbm2ddl.auto" value="update" /&gt;

			&lt;!--Configuração do segundo nível de cache --&gt;
			&lt;property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.EhCacheProvider" /&gt;
			&lt;property name="hibernate.cache.provider_configuration"	value="/ehcache.xml" /&gt;
			&lt;property name="hibernate.cache.use_minimal_puts" value="false" /&gt;
			&lt;property name="hibernate.cache.use_query_cache" value="true" /&gt;
			&lt;property name="hibernate.cache.use_second_level_cache"	value="true" /&gt;
			&lt;property name="hibernate.cache.use_structured_entries"	value="true" /&gt; 

			&lt;!--Configuração do pool de c3p0 --&gt;
			&lt;property name="hibernate.c3p0.min_size" value="5" /&gt;
			&lt;property name="hibernate.c3p0.max_size" value="20" /&gt;
			&lt;property name="hibernate.c3p0.timeout" value="300" /&gt;
			&lt;property name="hibernate.c3p0.max_statements" value="50" /&gt;
			&lt;property name="hibernate.c3p0.idle_test_period" value="100" /&gt;
			&lt;property name="c3p0.acquire_increment" value="1"/&gt;
		&lt;/properties&gt;
	&lt;/persistence-unit&gt;
&lt;/persistence&gt;

verifica tbm se os namespace do appContext estão corretos.