Spring + DAO + GenericDAO [RESOLVIDO]

10 respostas
D

Ola, estou com um problema, no qual possuo uma classe dao generica, e possuo outra classe que extend esse dao.

public class DAOImpl<E extends Entidade> implements DAO<E> {

    @Autowired
    private Conexao conexao;
    private static final Logger logger = Logger.getLogger(DAOImpl.class.getName());

public void salvar(E... entidades){
 System.out.println("Conexao: " + conexao);

}
}
public class UnidadeFederativaDAO extends DAOImpl<UnidadeFederativa> {...}

public void salvar(E... entidades){
super.salvar(entidades);

}
}

A minha conexão injetada pelo Spring está vindo null, como se algo sobre escrevesse minha anotação @Autowired, se seto ela na mão no Spring, como parametro, ele funciona.

Como faço para que está anotação não seja sobre escrita?

Obrigado.

10 Respostas

natanaelv

Sua conexão é private na Superclasse, para que a subclasse possa herdá-la
ela deve ser no mínimo protected.

D

Certo, mas mesmo assim não resolveu meu problema, o Spring não injeta o Objecto conexão ali.

Obrigado.

natanaelv

Ok.
Como você está utilizando a classe UnidadeFederativaDAO?
Se você estiver instanciando ela, assim:

UnidadeFederativaDAO unidade = new UnidadeFederativaDAO()

por exemplo, o Spring não vai conseguir injetar a classe. Isso porque o container
só consegue injetar classes que são gerenciadas pelo mesmo.

D

Não estou utilizando ele mesmo para gerenciar.

<bean id="conexao" class="com.tecWebSoft.ser.server.conexao.ConexaoImpl"/> <bean id="ufDAO" class="portal.UnidadeFederativaDAO"/>

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("context.xml");
            DAOImpl<UnidadeFederativa> conexao = (DAOImpl) applicationContext.getBean("ufDAO");
            conexao.salvar(null);
natanaelv

Esta linha:

DAOImpl<UnidadeFederativa> conexao = (DAOImpl) applicationContext.getBean("ufDAO");

te retorna alguma coisa?

D

Sim.

DAOImpl<UnidadeFederativa> conexao = (DAOImpl) applicationContext.getBean("ufDAO");
            System.out.println("daoIMpl: " + conexao);

O retorno fica: o toString() do Objecto.

daoIMpl: portal.UnidadeFederativaDAO@7e35ab86

Tive lendo sobre, eles falam que como meu @autowrite esta na subclasse minha UfDAo está sobre escrevendo está anotação.

natanaelv

Posta os códigos aí

D
public interface DAO<E extends Entidade> {

    void salvar(E... entidades) throws ChaveDuplicadaException, IllegalArgumentException, NaoEEntidadeException;

    void deletar(E... entidades) throws IllegalArgumentException, NaoEEntidadeException;

    List<E> listar(DetachedCriteria dc) throws IllegalArgumentException;

    E find(DetachedCriteria dc) throws IllegalArgumentException;
}
public class DAOImpl<E extends Entidade> implements DAO<E> {

    protected Conexao conexao;
    private static final Logger logger = Logger.getLogger(DAOImpl.class.getName());

    @Override
    public void salvar(E... entidades) throws ChaveDuplicadaException, IllegalArgumentException, NaoEEntidadeException {

        System.out.println("Conexao ------: " + conexao);
    }

    @Override
    public void deletar(E... entidades) throws IllegalArgumentException {
    }

    @Override
    public List<E> listar(DetachedCriteria dc) throws IllegalArgumentException {
        return null;
    }

    @Override
    public E find(DetachedCriteria dc) throws IllegalArgumentException {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    public Conexao getConexao() {
        return conexao;
    }

    public void setConexao(Conexao conexao) {
        this.conexao = conexao;
    }
}
public class UnidadeFederativaDAO extends DAOImpl<UnidadeFederativa> {

    public UnidadeFederativaDAO() {
    }

    @Override
    public void salvar(UnidadeFederativa... entidades) throws ChaveDuplicadaException, IllegalArgumentException, NaoEEntidadeException {
        try {
            super.salvar(entidades);
        } catch (ChaveDuplicadaException | IllegalArgumentException | NaoEEntidadeException e) {
            throw e;
        }
    }
}
public static void main(String[] args) {
        try {

            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("context.xml");
            DAOImpl<UnidadeFederativa> conexao = (DAOImpl) applicationContext.getBean("ufDAO");
            conexao.salvar(null);
        } catch (BeansException | IllegalArgumentException | ChaveDuplicadaException | NaoEEntidadeException e) {
            System.out.println("Erro: " + e);
        }

    }
[quote] [code]

ta na mão!

natanaelv

Insira a linha

<context:annotation-config />

no seu context.xml. Essa tag é necessária quando
você quer ativar o suporte a annotations no Spring

D

Fecho, muito obrigado.

só está tag mesmo que faltava.

Criado 1 de julho de 2013
Ultima resposta 2 de jul. de 2013
Respostas 10
Participantes 2