NullPointerException sempre que tento persistir um dado com Hibernate, usando Spring

Gostaria de saber se alguem pode me dar uma luz no que diz respeito ao meu problema. Estou desenvolvendo uma aplicação de teste que deve, simplemente agendar visitas. Para isso, deve-se persistir no BD um objeto usuario e um objeto visita. Estou usando hibernate para persistencia e spring para injeção de dependencia. No entanto nao estou conseguindo gravar nada no banco de dados, nem ler. Segue abaixo trechos do codigo da app para análise:

o persistence.xml está corretamente configurado com os dados do BD, consegui gerar as classes “usuario” e “visita” a partir das tabelas do banco… Criei a classe usuarioDao e, no entanto, ao tentar utilizar algum método dessa classe a partir da classe usuarioFacade, obtenho o seguinte erro:

Exception in thread “main” java.lang.NullPointerException
at facade.UsuarioFacade.gravar(UsuarioFacade.java:24)
at mainTest.Teste.main(Teste.java:43)
Java Result: 1

Alguem tem uma ideia de como fazer isso funcionar?

Valeu! :slight_smile:

ApplicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>

<!--
    Document   : applicationContext.xml
    Created on : 14 de Maio de 2009, 13:18
    Author     : Barretto
    Description:
        Purpose of the document follows.
-->

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       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.0.xsd

                           http://www.springframework.org/schema/aop
                           http://www.springframework.org/schema/aop/spring-aop-2.0.xsd

                           http://www.springframework.org/schema/tx
                           http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">


    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:/jdbc.properties"/>
    </bean>

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooleDataSource" destroy-method="close">
        <property name="driverClass" value="${jdbc.driverClassName}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="jdbcUrl" vavalue="${jdbc.url}"/>
    </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 name="showSql" value="true" />
                <property name="generateDdl" value="false" />
                <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" />
            </bean>
        </property>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" >
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    <tx:annotation-driven/>

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotatioBeanPostProcessor"/>

    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

    <bean id="usuario" class="domain.Usuario" scope="session"/>
    <bean id="usuarioDao" class="dao.UsuarioDao" />
    <bean id="usuarioFacade" class="dao.UsuarioFacade">
        <property name="usuarioDao" ref="usuarioDao"/>
    </bean>

    <bean id="visita" class="domain.Visita" scope="session"/>
    <bean id="visitaDao" class="dao.visitaDao" />
    <bean id="visitaFacade" class="dao.visitaFacade">
        <property name="visitaDao" ref="visitaDao"/>
    </bean>



</beans>

usuarioDao

[code]
public class UsuarioDao {

@PersistenceContext
private EntityManager em;

public UsuarioDao() {
    
}

public Usuario gravar(Usuario user) {
    return em.merge(user);
}

public void excluir(Usuario user) {
    em.remove(user);
}

public Usuario carregar(Integer id) {
    return em.find(Usuario.class, id);
}

public List obterTodos() {
    return em.createQuery("SELECT u FROM Usuario u").getResultList();
}
[/code]

usuarioFacade

[code]
public class UsuarioFacade {

private UsuarioDao usuarioDao;

public UsuarioFacade() {
    
}

public void gravar(Usuario usuario) {
    usuarioDao.gravar(usuario);
}

public void excluir(Usuario usuario) {
    usuarioDao.excluir(usuario);
}

public Usuario carregar(Integer id) {
    return usuarioDao.carregar(id);
}[/code]

Você deve disponibilizar um método set para o atributo usuarioDao no teu service, mas coloca aí o teu stacktrace para facilitar!

Olá, creio que você precisa criar um setter do EntityManager no seu dao.

Aí é que tá… o stack trace é apenas isso…

Tentei fazer uma modificação simples no construtor do UsuarioFacade, fazendo ele instanciar UsuarioDao = new UsuarioDao(), o que mudou foi só que o nullpointer apareceu tambem no UsuarioDao:

run-single:
java.lang.NullPointerException
at dao.UsuarioDao.gravar(UsuarioDao.java:35)
at facade.UsuarioFacade.gravar(UsuarioFacade.java:27)
at mainTest.Teste.main(Teste.java:40)
CONSTRUÍDO COM SUCESSO (tempo total: 1 segundo)

O teu EntityManager não está sendo injetado. (Ao invés do usuarioDao como eu suspeitava!)
Faça o seguinte, implemente um set para o teu EntityManager e no teu ApplicationContext adicione o bean do EntityManager ao bean usuarioDao

Thiago, inseri um setter como vc falou para o EntityManager… é isso mesmo?

@PersistenceContext
    private EntityManager em;

    public UsuarioDao() {
    }

    public void setEntityManager (EntityManager em) {
        this.em = em;

mas como ficaria o trecho do applicationContext.xml com o entityManager no bean do usuario? nao entendi muito bem como fazer… entra como property ou como bean?

Teoricamente a anotação @persistenceContext ja nao deveria cuidar disso?

 <bean id="usuario" class="domain.Usuario" scope="session"/>  
     <bean id="usuarioDao" class="dao.UsuarioDao" />  
     <bean id="usuarioFacade" class="dao.UsuarioFacade">  
        <property name="usuarioDao" ref="usuarioDao"/>  
     </bean>  

kiko, conseguiste resolver o problema?
Estou passando pela mesma situação que tu passou.

Grato.