Injetando o DAO com springo no meu Bean

Bom dia pessoal,

To querendo usar o Spring pra ficar responsavel por gerenciar os meus DAO’s e to tomando uma surra.
Quando coloco o DAO no meu bean
com a anotação @Inject, o DAO sempre fica nulo.

To usando JSF + Spring + Hibernate

Segue abaixo as classes

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:p="http://www.springframework.org/schema/p" 
	xmlns:security="http://www.springframework.org/schema/security"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-3.0.xsd
         http://www.springframework.org/schema/tx
         http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
         http://www.springframework.org/schema/security
         http://www.springframework.org/schema/security/spring-security-3.0.3.xsd">

	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" name="dataSource">
        <property name="driverClassName" value="org.postgresql.Driver"/>
        <property name="url" value="jdbc:postgresql://localhost:5432/bdxxx"/>
        <property name="username" value="xxx"/>
        <property name="password" value="xxx"/>
    </bean>

	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  		<property name="dataSource" ref="dataSource" />
  		<property name="jpaVendorAdapter">
    		<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
  		</property>
	</bean>
	
	<context:component-scan base-package="br.com"/>
	
	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>

	<tx:annotation-driven transaction-manager="transactionManager"/>

	<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
	
	<security:http use-expressions="true" auto-config="true">
	    <security:intercept-url pattern="/view/pages/user/**" access="isAuthenticated()"/>
	    <security:intercept-url pattern="/view/pages/**" access="permitAll"/> 
		<security:form-login login-page="/view/pages/base.jsf" default-target-url="/view/pages/base.jsf" always-use-default-target="true"/>
	</security:http>
	
	<security:authentication-manager alias="authenticationManager">
	    <security:authentication-provider user-service-ref="userDetailService"/>
	</security:authentication-manager>
	
	
</beans>

web.xml

<web-app 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-app_3_0.xsd"
	version="3.0">
	
	<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>springSecurityFilterChain</filter-name>
	  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
	</filter>
	
	<filter-mapping>
	  <filter-name>springSecurityFilterChain</filter-name>
	  <url-pattern>/*</url-pattern>
	</filter-mapping>

	<filter>
		<filter-name>jpaFilter</filter-name>
		<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
		<init-param>
			<param-name>entityManagerFactoryBeanName</param-name>
			<param-value>entityManagerFactory</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>jpaFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	<servlet>
		<servlet-name>Faces Servlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.jsf</url-pattern>
	</servlet-mapping>

	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>

faces-config.xml

<?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>

hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
	<!-- Atualiza as tabelas ao não apagando os dados. Se houver tabela nova deve ser utilizado a opção create -->
	<property name="hbm2ddl.auto">create</property> 

	<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>

	<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/xxx</property>
	<property name="hibernate.connection.username">xxx</property>
	<property name="hibernate.connection.password">xxx</property>

	<property name="hibernate.show_sql">true</property>
	<property name="hibernate.format_sql">true</property>
	<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
	
	<mapping class="br.com.queuau.domain.Usuario"></mapping>
	<mapping class="br.com.queuau.domain.Role"></mapping>
	
</session-factory>
</hibernate-configuration>

BaseDAO

package br.com.queuau.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.hibernate.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository("baseDao")
public class BaseDAO<T> {
	
	@PersistenceContext()
	EntityManager entityManager;
	
	@Autowired(required=false)
	private Class<T> classe;
	
	
	public BaseDAO() {
	}

	public BaseDAO(Class<T> classe) {
		this.classe = classe;
	}

	
	@Transactional(rollbackFor=Exception.class)
	public void salva(T pojo) {

		entityManager.persist(pojo);

	}
		
	public EntityManager getEntityManager(){
		return entityManager;
	}
	
	public Session getSession(){
		return (Session)entityManager.getDelegate();
	}

	public Class<T> getClasse() {
		return classe;
	}
}

UsuarioDAO

package br.com.queuau.dao;

import org.springframework.stereotype.Repository;

import br.com.queuau.domain.Usuario;

@Repository("usuarioDAO")
public class UsuarioDAO extends BaseDAO<Usuario> {

	public UsuarioDAO() {
		super(Usuario.class);
	}
	
}

UsuarioBean

package br.com.queuau.bean;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.inject.Inject;

import br.com.queuau.dao.UsuarioDAO;
import br.com.queuau.domain.Usuario;

@ManagedBean(name="usuarioBean")
@ViewScoped
public class UsuarioBean {

	private Usuario usuario = new Usuario();
	private @Inject UsuarioDAO usuarioDAO;
	
	@PostConstruct
	public void initialize(){
		System.out.println("");
	}
	
	
	public void save(){
		List<Usuario> list = usuarioDAO.pesquisaTodos();
		System.out.println("");
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
}

Já pesquisei em tudo que é lugar, mas até agra nada :frowning:

Se alguém puder me ajudar

Abraços

Pelo que olhei no seu codigo é o que esta acontecendo, seu UsuarioBean precisa ser adicionado ao contexto do Spring, por xml ou anotação, o spring não entende que @ManagedBean @ViewScoped pertença a seu contexto…

anotando com @Scoped… mas ai vai sair do gerenciamento padrão do jsf…

[quote]Pelo que olhei no seu codigo é o que esta acontecendo, seu UsuarioBean precisa ser adicionado ao contexto do Spring, por xml ou anotação, o spring não entende que @ManagedBean @ViewScoped pertença a seu contexto…

anotando com @Scoped… mas ai vai sair do gerenciamento padrão do jsf…[/quote]

e configurando no xml, daria algum problema? como ficaria??

Ninguem?? :frowning:

Bom dia tenta anotar seu dao com:

@Stateless
@LocalBean