Problemas com o Vraptor + JPA + Spring(Resolvido)

4 respostas
Mark0z

Olá galera, nesse teste abaixo eu consigo buscar um unico resultado através de um DAO(código no finalzinho do texto) mas quando uso uma logica do Vraptor (código abaixo do teste a seguir) ganho um NullPointerException:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:**/applicationContext*.xml"})
public class TestUsuarioDao {

    private UsuarioDao usuarioDao;
    private Long id = 3L;
	
    @Autowired
    public void setUsuarioDao(UsuarioDao usuarioDao) {
        this.usuarioDao = usuarioDao;
    }    

        @Test
	public void testParam() {

	Usuario u = new Usuario();
        u.setLogin("admin");
        u.setSenha("admin");

        String query="SELECT u FROM Usuario u WHERE u.login=:login AND u.senha=:senha";

        Map params = new HashMap();
        params.put("login", u.getLogin());
        params.put("senha", u.getSenha());

        System.out.println(u.getLogin()+"--"+usuarioDao.pesqParam(query, params).getLogin());
	}

}

O resultado é admin - admin, ou seja, ele conseguiu achar no BD um resultado único para aquela query!!

Mas no Vraptor eu não consigo dá um NullPointerException na logica efetuaLogin:

@Component
public class AdminLogic {

    @In(scope = ScopeType.SESSION, required = false)
    private Usuario usuario;

    private UsuarioDao usuarioDao;

    public AdminLogic(UsuarioDao usuarioDao) {
        this.usuarioDao = usuarioDao;
    }

    public void login(){}

    public String efetuaLogin(Usuario u){
        String query="SELECT u FROM Usuario u WHERE u.login=:login AND u.senha=:senha";
        
        Map params = new HashMap();
        params.put("login", u.getLogin());
        params.put("senha", u.getSenha());
        
        this.usuario=usuarioDao.pesqParam(query, params);
        //O Netbeans acusa o ponto do problema aqui!!!
        if(this.usuario!=null){
            return "ok";
        }else{
            return "invalid";
        }
    }

    public void logout(){
        usuario = null;
    }

    public void inicio(){}

    @Out(scope=ScopeType.SESSION)
    public Usuario getUsuario() {
        return usuario;
    }
}

Nesse código ele não acha o admin no BD como foi feito no teste de unidade do DAO.

aqui está os componenetes desse problemão:

O persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<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">

	<persistence-unit name="default">

		<provider>org.hibernate.ejb.HibernatePersistence</provider>

		<properties>
			<property name="hibernate.archive.autodetection"
				value="class, hbm" />

			<!--Configuracoes de dialeto e conexao-->
			<property name="hibernate.dialect"
				value="org.hibernate.dialect.MySQLInnoDBDialect" />
			<property name="hibernate.connection.driver_class"
				value="com.mysql.jdbc.Driver" />
			<property name="hibernate.connection.url"
				value="jdbc:mysql://localhost/zumas" />
			<property name="hibernate.connection.username"
				value="root" />
			<property name="hibernate.connection.password"
				value="takeover" />

			<!--Configuracoes de Debug-->
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />
			<property name="use_sql_comments" value="true" />
			<!--Configuração do pool de c3p0-->           
            <property name="hibernate.c3p0.min_size" value="5" />
            <property name="hibernate.c3p0.max_size" value="20" />
            <property name="hibernate.c3p0.timeout" value="300" />
            <property name="hibernate.c3p0.max_statements" value="50" /> 
            <property name="hibernate.c3p0.idle_test_period" value="3000"/>                      
            
		</properties>

	</persistence-unit>
</persistence>

O AplicationContext do Spring!

<?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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <bean id="entityManagerFactory"
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="default" />
    </bean>
    
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
    
    <bean id="transactionManager"
          class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>
    
    <tx:annotation-driven />
    
    
    <bean id="usuarioDao" class="br.com.nanstec.dao.imp.UsuarioDaoImp" />
    <bean id="grupoDao" class="br.com.nanstec.dao.imp.GrupoDaoImp" />
    <bean id="noticiaDao" class="br.com.nanstec.dao.imp.NoticiaDaoImp" />
</beans>

O DaoGenerico implementado:

@Transactional(readOnly = true, propagation = Propagation.REQUIRED)
public class DaoGenericoImp<T, ID extends Serializable> 
implements DaoGenerico<T, ID> {

	private EntityManager entityManager; 

	private final Class<T> oClass;//object class

	public Class<T> getObjectClass() {
		return this.oClass;
	}


	@SuppressWarnings("unchecked")
	@PersistenceContext
	public void setEntityManager(EntityManager em) {
		this.entityManager = em;
	}


	protected EntityManager getEntityManager() {
		if (entityManager == null)
			throw new IllegalStateException("Erro");
		return entityManager;
	}

	@SuppressWarnings("unchecked")
	public DaoGenericoImp() {
		this.oClass = (Class<T>)
		( (ParameterizedType) getClass().getGenericSuperclass() ).
		getActualTypeArguments()[0];

	}


	@Override
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
	public T atualizar(T object) {
		getEntityManager().merge(object);

		return object;

	}

	@Override
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
	public void excluir(T object) {
		object = getEntityManager().merge(object);
		getEntityManager().remove(object);
	}



	@Override
	public T pesquisarPorId(ID id) {
		return (T) getEntityManager().find(oClass, id);
	}	


	@Override
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
	public T salvar(T object) {
		getEntityManager().clear();
		getEntityManager().persist(object);


		return object;
	}

	@SuppressWarnings("unchecked")
	public List<T> todos(){
		String queryS = "SELECT obj FROM "+oClass.getSimpleName()+" obj";
		Query query = getEntityManager().createQuery(queryS);
		return query.getResultList();

	}

	@SuppressWarnings("unchecked")
	public List<T> listPesqParam(String query, Map<String, Object> params){
		Query q = getEntityManager().createQuery(query);
		for(String chave : params.keySet()){
			q.setParameter(chave, params.get(chave));

		}
		return q.getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<T> listPesqParam(String query, Map<String, Object> params,
			int maximo, int atual){
		Query q = getEntityManager().
					createQuery(query).
					setMaxResults(maximo).
					setFirstResult(atual);
		
		for(String chave : params.keySet()){
			q.setParameter(chave, params.get(chave));

		}
		return q.getResultList();
	}	
	
	@SuppressWarnings("unchecked")
	public List<T> listPesq(String query){
		Query q = getEntityManager().createQuery(query);
		return q.getResultList();
	}	
	
	@SuppressWarnings("unchecked")
	public T pesqParam(String query, Map<String, Object> params){
		Query q = getEntityManager().createQuery(query);
		for(String chave : params.keySet()){
			q.setParameter(chave, params.get(chave));

		}
		try{
			return (T) q.getSingleResult();
		}catch(NoResultException nre){
			return null;
		}
	}

}

4 Respostas

jvlouvem

Olá Mark0z, no seu vraptor.xml, está declarado o plugin do Spring ?

<plugin>org.vraptor.plugin.spring.SpringPlugin</plugin>
Mark0z

O Plugin está descrito no arquivo de conf. do Vraptor:
Quando executo a aplicação no NetBeans aparece um erro 500 no browser:

HTTP Status 500 -

type Exception report

message

descriptionThe server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Unable to fill value for key br.com.nanstec.dao.UsuarioDao

root cause

org.vraptor.component.ComponentInstantiationException: Unable to fill value for key br.com.nanstec.dao.UsuarioDao

note The full stack traces of the exception and its root causes are available in the Sun GlassFish Enterprise Server v2.1 logs.
Sun GlassFish Enterprise Server v2.1

Conf. do Vraptor:

<vraptor>
    <regex-view-manager>/WEB-INF/$component/$logic.$result.jsp</regex-view-manager>
    <plugin type="org.vraptor.plugin.spring.SpringPlugin">
        <property name="configFile">classpath:applicationContext*.xml</property>
    </plugin>
</vraptor>

Aqui AdminLogic modificado como aconselhado pelo site tutorial do vraptor:

@Component
public class AdminLogic {

    @In(scope = ScopeType.SESSION, required = false)
    private Usuario usuario;

    private UsuarioDao usuarioDao;

    public AdminLogic(UsuarioDao usuarioDao) {
        this.usuarioDao = usuarioDao;
    }

    public void login(){}

    public String efetuaLogin(Usuario u){
        String query="SELECT u FROM Usuario u WHERE u.login=:login AND u.senha=:senha";
        Map params = new HashMap();
        params.put("login", u.getLogin());
        params.put("senha", u.getSenha());
        this.usuario=usuarioDao.pesqParam(query, params);
        if(this.usuario!=null){
            return "ok";
        }else{
            return "invalid";
        }
    }

    public void logout(){
        usuario = null;
    }

    public void inicio(){}

    @Out(scope=ScopeType.SESSION)
    public Usuario getUsuario() {
        return usuario;
    }
}
Mark0z

Eu já vi esse problema em vários fóruns e em nenhum deles a resposta…
Será que o problema é no proprio Vraptor ou entre “a cadeira e o computador” rrsrs??

Mark0z

Tudo Resolvido:
O problema foi que defini a as id como por exemplo “usuarioDao” e não “br.com.nanstec.dao.UsuarioDao” por isso não ejetava.
Obrigado pela ajuda!!!

<?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:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

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

    <context:annotation-config />

    <bean id="transactionManager"
          class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>
    
    <tx:annotation-driven />
    

    <bean id="br.com.nanstec.dao.UsuarioDao" class="br.com.nanstec.dao.imp.UsuarioDaoImp" />
    <bean id="br.com.nanstec.dao.GrupoDao" class="br.com.nanstec.dao.imp.GrupoDaoImp" />
    <bean id="br.com.nanstec.dao.NoticiaDao" class="br.com.nanstec.dao.imp.NoticiaDaoImp" />
    
</beans>
Criado 29 de abril de 2009
Ultima resposta 4 de mai. de 2009
Respostas 4
Participantes 2