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;
}
}
}