Spring não injeta as dependências

7 respostas
T

Boa tarde pessoal.
Estou iniciando com Spring e não estou consiguindo fazer funcionar direito. Estou utilizando Spring 3.0.5 no Toncat 6.
Meu applicationContext.xml está assim:

<?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">
    
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/banco?autoReconnect=true" />
        <property name="username" value="usuario" />
        <property name="password" value="senha" />
    </bean>
    
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="annotatedClasses">
            <list>
                <value>entity.Idioma</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>
    
    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    
    <bean id="idiomaDAO" class="entity.DAO.IdiomaDAO">
        <constructor-arg ref="hibernateTemplate" />
    </bean>
    	
    <bean id="cancelamentoVenda" class="webservices.CancelamentoVenda">
        <constructor-arg ref="idiomaDAO" />
    </bean>
</beans>

Bom, quando aciono o webservice CancelamentoVenda e tento utilizar o DAO que deveria ser injetado nele recebo uma NullPoiterException.

Quando, no applicationContext.xml, adiciono

<bean id="teste" class="webservices.CancelamentoVenda" init-method="processa" >
    	<constructor-arg ref="idiomaDAO" />
</bean>

ai sim a injeção de dependência funciona e consigo inserir alguma coisa no banco.

Existe alguma coisa que seja necessário fazer para que seja iniciada a iniciada a injeção de dependências? Já procurei e testei várias maneiras de fazer funcionar mas até agora a única coisa que funcionou foi utilizando o init-method.

Ah sim, também já tentei fazer a injeção de dependências por setters.

7 Respostas

romarcio

Você precisa informar onde quer que a injeção de dependencoa ocorra. No caso vc precisa injetar o idiomaDAO na classe CancelamentoVenda, então tem que fazer

<bean id="teste" class="webservices.CancelamentoVenda" init-method="processa" > <constructor-arg ref="idiomaDAO" /> </bean>

Mas como está usando a versão 3, faça por anotações que é bem menos trabalhoso e simples.

Batney

Tiago no seu applicationContext.xml vc deve adicionar:

<!-- define os pacotes/subpacotes que onde serão procurados beans do spring -->
	<context:component-scan base-package="br.com.projeto.controle" />

	<!-- habilita a configuração por annotations -->
	<context:annotation-config />

ai o spring vai scannear todos os beans que estiverem anotados como serviço ou repositório no caso do DAO.

ai na classe CancelamentoVenda vc injeta o idiomaDAO.

T

Em primeiro lugar, bom dia, e obrigado pelas respostas.

Romarcio, fazendo desse forma não seria para executar o método ao iniciar a aplicação? Pelo menos foi isso que ocorreu aqui.

Bom, não vou poder utilizar anotações. Essa aplicação que estou desenvolvendo vai ser integrada ao sistema já existente, que não utiliza anotações, então tenho que manter dessa forma.Bem que eu preferiria utilizar anotações :expressionless:

Batney, não há como fazer isso sem utilizar anotações?

romarcio

Você precisa fazer assim então:

&lt;bean id="idiomaDAO" class="entity.DAO.IdiomaDAO"&gt;  
        &lt;constructor-arg ref="hibernateTemplate" /&gt;  
&lt;/bean&gt;

&lt;bean id="cancelamentoVenda" class="webservices.CancelamentoVenda"&gt;
        &lt;property name="idiomaDAO" ref="idiomaDAO"/&gt;
&lt;/bean&gt;

E na classe CancelamentoVenda você precisa criar um setter de idiomaDAO para fazer uso da injeção de dependencia:

private IdiomaDAO idiomaDAO; public void setIdiomaDAO(IdiomaDAO idiomaDAO) { this.idiomaDAO= idiomaDAO; }

T

Então cara, já tinha tentando dessa forma, mas ao executar da sempre NullPointerException no IdiomaDAO.
A impressão que dá é de que o Spring não está sendo carregado na inicialização do tomcat, ou que a injeção de dependência não está sendo feita por ser uma chamada à um webservice.

Estou continuando os testes aqui. Se econtrar a solução eu posto aqui.

Muito obrigado.

romarcio

Você já usava o Spring nessa aplicação ou tá adaptando agora?

T

Romarcio, há uma aplicação, a qual terei que integrar o sistema que estou desenvolvendo, que já utiliza Spring. O que estou desenvolvendo não utilizava Spring, e estou agora adaptando.

Porém agora consegui resolver, mas com Spring 2.5, utilizando esse exemplo: http://www.mkyong.com/webservices/jax-ws/jax-ws-spring-integration-example/

Quando tiver um tempo voltarei ao Spring 3 para tentar fazer o mesmo utilizando ele.

Muito obrigado.

Criado 5 de agosto de 2011
Ultima resposta 8 de ago. de 2011
Respostas 7
Participantes 3