Me ajudem please, Hibernate com Spring

26 respostas
R

Bom dia amigos, amigos estou com um pequeno probleminha a mais de uma semana e não estou achando o erro, eu sei que e uma besteira mais não estou conseguindo enxergar, queria uma ajuda de vcs…

Tenho uma aplicação que utiliza os seguintes frameworks Hibernate,Spring,Struts e Servlet, essa aplicação utiliza três base de dados, preciso acessar uma tabela de uma das base de dados, quem configura os acessos dessas bases são o Spring junto com o Hibernate, fiz i mapeamento com o hibernate e as classes de configuração.

O seguinte erro que o ocorre senhores é:

  java.lang.NullPointerException, quando aplicação acesso o método findByPrimaryKey. Ou seja, ele não está conseguindo trazer informações da base de dados. Então queria que vcs me ajudasse a enxergar esse erro, eu tenho quase certeza que e na configuração com o hibernate e o Spring...

Vou postar os códigos.

SPRING

Configuração do application-resources.xml:

<bean id="dataSourceSicap" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="####################3"/>
        <!-- property name="url" value="################"/>
        <property name="username" value="#######"/>
        <property name="password" value="#######"/ -->
        
        <!-- Desenvolvimento -->
        <property name="url" value="###########"/>
        <!-- Homologação -->
        <!-- property name="url" value="#########"/ -->
        
         <property name="username" value="################"/>
         <property name="password" value="################"/>
         
    </bean>

Configuração do application-persistencia.xml:

<bean id="sessionFactoryServidorSiape" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSourceSicap"/>
        <property name="mappingResources">
            <list>
             	<value>##/##/##/##/model/Rubrica.hbm.xml</value>             	
            </list>
        </property>

        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>


	<bean id="rubricaDao" class="##.##.##.##.dao.RubricaDaoImpl" parent="baseDao">
		<property name="modelClassName" value="##.##.##.##.model.Rubrica" />
		<property name="sessionFactory" ref="sessionFactoryServidorSiape"/>
	</bean>
HIBERNATE

Rubrica.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="##.##.##.##.model">
	<class name="Rubrica" table="#####">
				
		<id name="codigo" type="java.lang.Integer" unsaved-value="null">
			<column name="####" precision="10" scale="0"/>  
		</id>

		<property name="nome" column="##" />
		<property name="siglaAssunto" column="######" />
		
	</class>
</hibernate-mapping>

RubricaDao.java

import java.util.List;

import ##.##.##.##.model.Rubrica;

public interface RubricaDao{ 

	public List<Rubrica> findAll();

	public Rubrica findByPrimaryKey(Integer id);

	public void insert(Rubrica rubrica);

	public void update(Rubrica rubrica);

	public void delete(Rubrica rubrica);
}

RubricaDaoImpl.java

import ##.##.##.##.model.Rubrica;

public class RubricaDaoImpl extends BaseDaoImpl<Rubrica,Integer> implements RubricaDao {
	//TODO
}

RubricaBusinessImpl.java

public String buscaNomeRubrica(Integer codRubrica) {
		// TODO Auto-generated method stub
	
		Rubrica  rubrica = rubricaDao.findByPrimaryKey(codRubrica); // A CHAMADA DESSE CARA QUE DA O ERRO
		String nomeRubrica = rubrica.getNome();
		return nomeRubrica;
	}

ERROOOOOOO

class java.lang.NullPointerException
2011-04-25 08:51:33,340 [http-8080-Processor23] ERROR org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/###].[action].invoke() - 
> Servlet.service() for servlet action threw exception
java.lang.NullPointerException
	at ##.##.##.##.business.RubricaBusinessImpl.buscaNomeRubrica(RubricaBusinessImpl.java:46)

26 Respostas

L

NullPointer eh qdo vc esta tentando receber algo e esse algo naum foi inicializado…deu pra clarear?

A

Quando você executa o debug, qual valor chega para codRubrica
?public String buscaNomeRubrica(Integer codRubrica) {

R

A chega o id da rubra que eu quero certinho…

R

A chega o ID da rubrica que eu quero certinho…

A

Ok. E rubricaDao foi instanciado na classe em algum lugar? Rubrica rubrica = rubricaDao.findByPrimaryKey(codRubrica);

A

findByPrimaryKey está caindo na sua implementação?

R

Sim sim,

public class RubricaBusinessImpl extends BaseBusinessImpl implements RubricaBusiness {
private RubricaDao rubricaDao;

R
public class RubricaBusinessImpl extends BaseBusinessImpl implements RubricaBusiness {
	private RubricaDao	rubricaDao;
	
	public String buscaNomeRubrica(Integer codRubrica) {

		Rubrica  rubrica = rubricaDao.findByPrimaryKey(codRubrica);
		String nomeRubrica = rubrica.getNome();
		return nomeRubrica;
	}

}
A
[quote=Rodrigo.Mlechior]
public class RubricaBusinessImpl extends BaseBusinessImpl implements RubricaBusiness {
	private RubricaDao	rubricaDao;
	
	public String buscaNomeRubrica(Integer codRubrica) {

		Rubrica  rubrica = rubricaDao.findByPrimaryKey(codRubrica);
		String nomeRubrica = rubrica.getNome();
		return nomeRubrica;
	}

}

[/quote]

[code]private RubricaDao  rubricaDao;
Você está usando injeção de dependência? Se sim, quem está injetando neste objeto?
P

Vc tem que dizer para o spring onde ele ira injetara as dependencias das suas classes. Isso pode ser tanto configurado pelo xml ou por anotation.
No caso por anotação ficaria algo ± assim:

@Service
public class RubricaBusinessImpl extends BaseBusinessImpl implements RubricaBusiness {  
     @Autowired
     private RubricaDao  rubricaDao; //Spring ira injetar pelo atributo, + vc pode adicionar no metodo get/set q ele usara a injeção no padrão javabeans.
A

Resolveu?

R

Bom dia amigos, desculpa pela ausência ontem, aconteceu uns emprevisto que nao deu para acompanhar,

então, ja existe a configuração do atributo rubricaDao

<property name="hibernateProperties">
	<bean id="rubricaDao" class="##.##.##.##.dao.RubricaDaoImpl" parent="baseDao">
		<property name="modelClassName" value="##.##.##.##.model.Rubrica" />
		<property name="sessionFactory" ref="sessionFactoryServidorSiape"/>
	</bean>
R

Quando debugo e vou entrar na linha:

Rubrica  rubrica = rubricaDao.findByPrimaryKey(codRubrica);

ocorrer o erro…

R

Alguem?

C

Ele chega a executar a consulta e mostrar a SQL no console?

R

Tenta assim:

public class RubricaBusinessImpl extends BaseBusinessImpl implements RubricaBusiness {  
@Resource     
private RubricaDao  rubricaDao;
R

Não, quando chegar na linha :

Rubrica  rubrica = rubricaDao.findByPrimaryKey(codRubrica);

ele da o erro que esta comentado na descição do post…

R

raf4ever:
Tenta assim:

public class RubricaBusinessImpl extends BaseBusinessImpl implements RubricaBusiness { @Resource private RubricaDao rubricaDao;

Vou tentar agora mestre

P

esta sua classe RubricaBusinessImpl esta sendo gerenciada pelo Spring ?
o spring só injeta as dependências nas classes que ele conhece vc tem que configurar esta classe tb no seu xml, ou via anotation, vc fez isso ?

R

configuração do applicationContext-negocio.xml

<bean class="br.gov.agu.sicap.business.RubricaBusinessImpl"
		id="rubricaBusiness">
</bean>

Uma duvida, e dessa forma?
—>

<bean class="br.gov.agu.sicap.business.RubricaBusinessImpl"
		id="rubricaBusiness">
<property name="rubricaDao" ref="rubricaDao" />
</bean>
P

Sim…
Quando vc sobe a sua aplicação ñ dá nenhum erro do Spring ou Hibernate quanto o msm esta iniciando ?

C

Olha um exemplo bem limpo para você usar…
Aí você passa a usar suas classes anotadas…

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

	<!-- Hibernate Session Factory -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="XXXXXXXXXXXXXXXXXXXX" />
		<property name="url" value="XXXXXXXXXXXXXXXXXXXXXXXXX" />
		<property name="username" value="XXXXXX" />
		<property name="password" value="XXXXXXXXXX" />
	</bean>
	
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.XXXXXXXXXXXDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
			</props>
		</property>
		<property name="packagesToScan" value="pacote.ex" />
	</bean>

	<context:component-scan base-package="pacote.ex">
		<context:include-filter type="annotation"
			expression="org.springframework.stereotype.Service" />
	</context:component-scan>

	<context:annotation-config />
	<context:component-scan base-package="pacote.ex" />
</beans>

Classe Controladora :

@Controller
public class TesteController {
	
    private Teste teste;
   
    @Resource
    private TesteDao testeDao;
       
    public void prepararNovoTeste(ActionEvent actionEvent){
    	this.teste = new Teste();
    }
    
    
    public void adicionarTeste(ActionEvent actionEvent){
    	this.usuarioDao.save(this.teste);
    }

    public Teste getTeste() {
	return this.teste;
    }

    public void setTeste(Teste teste) {
	this.teste= teste;
    }

    public TesteDao getTesteDao() {
	return testeDao;
    }
	
    public void setTesteDao(TesteDao dao) {
	this.testeDao= dao;
    }
}

E a Dao:

@Service
public class TesteDaoImpl extends HibernateDaoSupport implements TesteDao {
	
	@Autowired
	public TesteDaoImpl(SessionFactory sessionFactory){
		setSessionFactory(sessionFactory);
	}
	
    	public void save(Teste Teste) {
    		getHibernateTemplate().save(Teste);
    	}
    	public Teste getTeste(int id) {
       	 return (Teste) getHibernateTemplate().load(Teste.class, id);
    	}
    	@SuppressWarnings("unchecked")
	public List<Teste> list() {
        	@SuppressWarnings("rawtypes")
		List lista = getHibernateTemplate().find("from Teste");
        	return lista;
   	}

    	public void remove(Teste Teste) {
    		getHibernateTemplate().delete(Teste);
    	}
   	public void update(Teste Teste) {
    		getHibernateTemplate().update(Teste);
    	}  
}

Bom isso é só um exemplo simples pra ver se te ajuda…

Abs,

R

Hum muito obrigado amigao, tentar aqui fazer da forma do seu exemplo…

quando fizer o teste eu dou uma posição aqui, obrigado a todos que estao me ajudando…

P

No dao eu uso e aconselho a usar a anotação @Repository e não @Service
Se vc conseguir usar anotação fica muito mais pratico, mas vc tera q rever sua configuração do Spring.

R

Bom dia amigos, Amigos até comecei a montar um arquivo applicationContext mais não vai da certo pq se eu fizer isso vai mudar na regra de negocio da aplicação que é uma aplicação bem complexa, então continuei fazendo da forma que estava fazendo, mais eu fiz uns testes aqui que agora vai ficar mais fácil para alguém me ajudar… Olha só que eu fiz…

Com a dica do nosso amigo:

Priuli:
esta sua classe RubricaBusinessImpl esta sendo gerenciada pelo Spring ?
o spring só injeta as dependências nas classes que ele conhece vc tem que configurar esta classe tb no seu xml, ou via anotation, vc fez isso ?

Estava dessa forma

<bean class="br.gov.agu.sicap.business.RubricaBusinessImpl"
		id="rubricaBusiness">
	</bean>

Dessa forma ela até consegue subir o projeto para o tomcat mais da erro na chamada :

Rubrica  rubrica = rubricaDao.findByPrimaryKey(codRubrica);

Só que na RubricaBunisessImpl existe um relacionamento com a RubricaDao que necessita esta presente nesta configuração do Spring acima, mais quando eu coloco
É desta forma que eu acredito que seja, da erro na configuração do application-negocio.xml e nao consegue subir o projeto para o tomcat…

<bean class="br.gov.agu.sicap.business.RubricaBusinessImpl"
		id="rubricaBusiness">
		<property name="rubricaDao" ref="rubricaDao" />
	</bean>

Então acredito pessoal que estamos chegando la…

P

Cara… é assim mesmo que configura as dependencias no xml de config do SpringFramework, o problema deve estar na sua propriedade rubricaDao olha na sua classe RubricaBusinessImpl e ve se tem metodos get/set para estre atributo (tem q ter), o nome do metodo tem que estar no padrão javabens e os modificadores dos metodos tem que estar publico.

private RubricaDao rubricaDao;

public RubricaDao getRubricaDao(){
return  rubricaDao;
}
public void setRubricaDao(RubricaDao rubricaDao){
}
Criado 25 de abril de 2011
Ultima resposta 28 de abr. de 2011
Respostas 26
Participantes 6