Spring 3.2 - Tentando aprender =/

5 respostas
alexandrenilton

Galera, estou com um projeto que estou fazendo para dar uma reciclada em meus conhecimentos. Pois bem. Comprei um livro que só me deixou dúvidas, tentei seguir sozinho e me senti menos perdido que através do livro (Java Na web Com JSF, Spring e netbeans 6)
Porém estou com dificuldades…
Vamos lá
Não consigo com que a classe abaixo “UsuarioFacade” recebe a Injeção de uma instancia da classe “UsuarioDao” na variavel “usuarioDao” conforme a classe abaixo (Quando ele tenta acessar usuarioDao da Null Pointer, ou seja, não conseguiu receber a instancia da classe via DI:

package facade;

import dao.UsuarioDao;
import dominio.Usuario;
import java.util.List;


public class UsuarioFacade {
    
    private UsuarioDao usuarioDao;
    
    /** Creates a new instance of UsuarioFacade */
    public UsuarioFacade() {
    }
    
    public Usuario gravar(Usuario usuario) {
        return usuarioDao.gravar(usuario);
    }
    
    public void excluir(Usuario usuario) {
        usuarioDao.excluir(usuario);
    }
    
    public Usuario carregar(Integer id) {
        return usuarioDao.carregar(id);
    }
    
    public List obterTodos() {
        return usuarioDao.obterTodos();
    }
    
    public List obterPorNome(String nome) {
        return usuarioDao.obterPorNome(nome);
    }
    
    public List obterPorLogin(String login) {
        return usuarioDao.obterPorLogin(login);
    }
    
    public Usuario obterPorLoginSenha(String login, String senha) {
        return usuarioDao.obterPorLoginSenha(login, senha);
    }
    
    public UsuarioDao getUsuarioDao() {
        return usuarioDao;
    }
    
    public void setUsuarioDao(UsuarioDao usuarioDao) {
        this.usuarioDao = usuarioDao;
    }
}

Eis agora o 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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <!-- Configurador que substitui os marcadores ${...} com os valores definidos no arquivo de properties -->
    <!-- (in this case, JDBC-related settings for the dataSource definition below) -->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:/jdbc.properties"/>
    </bean>
    
    <!-- Local C3P0 DataSource que trabalha em qualquer ambiente, em ambientes de produção use jndi -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="${jdbc.driverClassName}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
    
    <!-- JPA EntityManagerFactory -->
    <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>
    
    <!-- Transaction manager para um JPA EntityManagerFactory simples (alternativa ao JTA) -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>
    
    <!-- PostProcessors para realizar injeção de recursos de acordo com a especificação JPA (@PersistenceContext, @PersistenceUnit). -->
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
    
    <!-- PostProcessors para realizar a conversão de exceções nas classes @Repository (das exceções nativas como JPA PersistenceExceptions to Spring's DataAccessException). -->
    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
    
    <!-- Será automaticamente transacional graças ao @Transactional. EntityManager irá ser auto-injetado graças ao @PersistenceContext. PersistenceExceptions irá ser auto-convertido graças ao @Repository. -->
    <bean id="usuario" class="dominio.Usuario" scope="session" />
    <bean id="usuarioDao" class="dao.UsuarioDao" />
    <bean id="usuarioFacade" class="facade.UsuarioFacade">
        <property name="usuarioDao" ref="usuarioDao" />
    </bean>
    
    <bean id="contato" class="dominio.Contato" scope="session" />
    <bean id="contatoDao" class="dao.ContatoDao" />
    <bean id="contatoFacade" class="facade.ContatoFacade">
        <property name="contatoDao" ref="contatoDao" />
    </bean>
    
    <bean id="endereco" class="dominio.Endereco" scope="session" />
    <bean id="enderecoDao" class="dao.EnderecoDao" />
    <bean id="enderecoFacade" class="facade.EnderecoFacade">
        <property name="enderecoDao" ref="enderecoDao" />
    </bean>
    
    <bean id="meioContato" class="dominio.MeioContato" scope="session" />
    <bean id="meioContatoDao" class="dao.MeioContatoDao" />
    <bean id="meioContatoFacade" class="facade.MeioContatoFacade">
        <property name="meioContatoDao" ref="meioContatoDao" />
    </bean>
    
    <bean id="sessionFactory"
    	class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    	<property name="configLocation"
    		value="classpath:hibernate.cfg.xml">
    	</property>
    </bean>
</beans>

Obs: applicationContext está na pasta: Projeto/src

jdbc.properties:

jdbc.driverClassName= com.mysql.jdbc.Driver
jdbc.url= jdbc:mysql://localhost:3306/agenda
jdbc.username=root
jdbc.password=senhaUltraSecreta

Agora a classe de testes que utilizo para verificar a implementação acima

```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;

import java.util.List;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import dominio.Usuario;
import facade.UsuarioFacade;

/**
 *
 * @author Yuri
 */
public class UsuarioFacadeTeste {
    
    private ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

    public UsuarioFacadeTeste() {
    }

    @BeforeClass
    public static void setUpClass() throws Exception {
         
    }

    @AfterClass
    public static void tearDownClass() throws Exception {
    }

    @Before
    public void setUp() {
    }

    @After
    public void tearDown() {
    }

    /**
     * Test of gravar method, of class UsuarioFacade.
     */
    @Test
    public void gravar() {

        Usuario usuarioTeste = new Usuario();
        usuarioTeste.setLogin("guest");
        usuarioTeste.setNome("guest");
        usuarioTeste.setSenha("guest");
        
        System.out.println("gravar usuário");
        
        UsuarioFacade instance =(UsuarioFacade)context.getBean("usuarioFacade");
        Usuario result = instance.gravar(usuarioTeste);
        
        try {
            assertNotNull(result.getIdUsuario());
        } catch (AssertionError e){
            fail("Falhou a gravação de usuário.");
        }

    }

    /**
     * Test of excluir method, of class UsuarioFacade.
     */
    @Test
    public void excluir() {
        System.out.println("excluir");
        Usuario usuario = null;
        UsuarioFacade instance = new UsuarioFacade();
        instance.excluir(usuario);
        // TODO review the generated test code and remove the default call to fail.
        fail("The test case is a prototype.");
    }

    /**
     * Test of carregar method, of class UsuarioFacade.
     */
    @Test
    public void carregar() {
        System.out.println("carregar");
        Integer id = null;
        UsuarioFacade instance = new UsuarioFacade();
        Usuario expResult = null;
        Usuario result = instance.carregar(id);
        assertEquals(expResult, result);
        // TODO review the generated test code and remove the default call to fail.
        fail("The test case is a prototype.");
    }

    /**
     * Test of obterTodos method, of class UsuarioFacade.
     */
    @Test
    public void obterTodos() {
        System.out.println("obterTodos");
        UsuarioFacade instance = new UsuarioFacade();
        List expResult = null;
        List result = instance.obterTodos();
        assertEquals(expResult, result);
        // TODO review the generated test code and remove the default call to fail.
        fail("The test case is a prototype.");
    }

    /**
     * Test of obterPorNome method, of class UsuarioFacade.
     */
    @Test
    public void obterPorNome() {
        System.out.println("obterPorNome");
        String nome = "";
        UsuarioFacade instance = new UsuarioFacade();
        List expResult = null;
        List result = instance.obterPorNome(nome);
        assertEquals(expResult, result);
        // TODO review the generated test code and remove the default call to fail.
        fail("The test case is a prototype.");
    }

    /**
     * Test of obterPorLogin method, of class UsuarioFacade.
     */
    @Test
    public void obterPorLogin() {
        System.out.println("obterPorLogin");
        String login = "";
        UsuarioFacade instance = new UsuarioFacade();
        List expResult = null;
        List result = instance.obterPorLogin(login);
        assertEquals(expResult, result);
        // TODO review the generated test code and remove the default call to fail.
        fail("The test case is a prototype.");
    }

    /**
     * Test of obterPorLoginSenha method, of class UsuarioFacade.
     */
    @Test
    public void obterPorLoginSenha() {
        System.out.println("obterPorLoginSenha");
        String login = "";
        String senha = "";
        UsuarioFacade instance = new UsuarioFacade();
        Usuario expResult = null;
        Usuario result = instance.obterPorLoginSenha(login, senha);
        assertEquals(expResult, result);
        // TODO review the generated test code and remove the default call to fail.
        fail("The test case is a prototype.");
    }

    /**
     * Test of getUsuarioDao method, of class UsuarioFacade.
     */
    

}

Peço encarecidamente, se alguem tiver uma luz ai! Fico mt agradecido. Pois com o Livro que citei, já estou revoltado. Como publicam um livro sendo que nem o exemplo passo-a-passo fornecido não funciona? Coisa de doido rsrsrs.

5 Respostas

darksteel3000

E ai amigo, td tranquilo? Seguinte, a forma com que estais fazendo está muito arcaica e é sujeita a dar enormes problemas.

Tem um tutorial aqui : http://www.mkyong.com/spring/maven-spring-hibernate-annotation-mysql-example/
que explica como fazer isso com Maven e annotations, que fica bem mais limpo.

Caso também se interesse, irei publicar até amanha um post no meu site de como fazer isso de uma forma mais clara e em portugues hehe, e ainda vou ensinar como fazer um Super DAO Generico todo gerenciado pelo spring.

alexandrenilton

Maravilha!
Vou tentar executar esse tutorial ai. Mas assim que vc publicar em seu site, me passa o endereço para eu conferir
Alias, me passe o endereço para eu conferir isso e mais outras coisas
Obrigado! :smiley:

darksteel3000

O endereço ta na minha assinatura, la ja postei como configurar um projeto pronto com maven + Primefaces + JSF 2 + Hibernate 4.1 + Spring. Abração

alexandrenilton

Opa! Eu denovo!
Pode me tirar uma dúvida?
Nesse link que vc me passou ele usa o Maven. Instalei o 2.2.0 e estou seguindo os passos
Executei o comando svn generate:archetype
Porém ele me retornou mt projetos (base) e pediu para escolher um.
Escolhi o 15, conforme diz lá a page

E:\workspace>mvn archetype:generate
[INFO] Scanning for projects...
...
Choose a number:  
(1/2/3....) 15: : 15
...
Define value for groupId: : com.mkyong.common
Define value for artifactId: : HibernateExample
Define value for version:  1.0-SNAPSHOT: :
Define value for package:  com.mkyong.common: : com.mkyong.common
[INFO] OldArchetype created in dir: E:\workspace\HibernateExample
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------

Porém o 15, não tem nada a ver com o projeto ai de Hibernate e talz. Qual devo escolher? Ele retorna mais de 700 tipos.
Obrigado!

darksteel3000

Amigo, escolhe esse: ?org.apache.maven.archetypes? onde o artifact id dele é softeu-archetype-jsf.

Abaixo segue o link domeu tutorial de como arrumar o projeto pra preparar para as tecnologias descritas. Eu particulamente não gosto da forma com que o MKyong gera a estrutura maven dele, tendo o eclipse para nos auxiliar, podemos com 3 clicks criar de uma forma bem mais facil. Caso queira, leia o meu tutorial, abraços !

http://heyxampis.com/2013/03/23/configurando-um-projeto-no-maven-com-jsf-2-1-primefaces-3-5-hibernate-4-1-e-spring-3-2/

Criado 2 de maio de 2013
Ultima resposta 3 de mai. de 2013
Respostas 5
Participantes 2