2011-10-06 37 views
0

我在正確設置Spring環境時遇到了一些麻煩。在我applicationContext.xml我:Spring 3將@Required字段注入爲NULL

... 
<context:annotation-config /> 
<context:component-scan base-package="com.company.server" /> 

<import resource="databaseConfig.xml" /> 

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

,並在我的databaseConfig

<tx:annotation-driven /> 

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
    <property name="driverClass"> 
     <value>${jdbc.driver.className}</value> 
    </property> 
    <property name="jdbcUrl"> 
     <value>${jdbc.url}</value> 
    </property> 
    <property name="user"> 
     <value>${jdbc.username}</value> 
    </property> 
    <property name="password"> 
     <value>${jdbc.password}</value> 
    </property> 
</bean> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource"> 
     <ref bean="dataSource" /> 
    </property> 
    <property name="packagesToScan" value="org.adit.spring.hibernate.entity" /> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">${jdbc.hibernate.dialect}</prop> 
      <prop key="hibernate.hbm2ddl.auto">create</prop> 
      <prop key="hibernate.show_sql">false</prop> 
     </props> 
    </property> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory"> 
     <ref bean="sessionFactory" /> 
    </property> 
</bean> 

現在我的問題開始。如果你看看以下類:

@Service 
public class ViewContactsServiceImpl extends RemoteServiceServlet implements ViewContactsService { 

    private ContactDao contactDao; 

    @Autowired 
    public void setContactDao(ContactDao contactDao) { 
     this.contactDao = contactDao; 
    } 

    @Override 
    public ArrayList<Contact> getAllContacts() { 
     return contactDao.getAllContacts(); 
    } 
} 

在應用程序啓動過程中一切都很好。 Spring不會抱怨它不能創建這個bean,或者它不能注入這個屬性。但是,每當我嘗試訪問contactDao字段時,它都是null

謝謝!


UPDATE

我還要提到我ContactDaoImpl.java被定義爲:

@Repository("contactDao") 
@Transactional 
public class ContactDaoImpl implements ContactDao { ... } 

更新2

NB。這是一個GWT應用程序。

ViewContactServiceImpl.java

package com.company.server.service.viewcontacts; 

ViewContactsService.java

package com.company.client.viewcontacts; 

ContactDaoImpl.java

package com.company.server.contact; 

ContactDao.java

package com.company.server.contact; 
+0

ViewContactsServiceImpl類及其接口的包是什麼? –

+0

@ danny.lesnik - 查看我的更新2. –

+0

對不起,我忘了提及ContactDaoImpl及其界面包呢? –

回答

3

我變薄ViewContactsServiceImpl正在由GWT實例化(基於RemoteServiceServlet猜測) - 因此它不Spring管理豆。

您需要通過覆蓋和實現init方法手動調用自動連線。類似於下面顯示的代碼(從此article)。正如該文章中所解釋的那樣,創建一個AbstractRemoteServlet即可以擴展所有的GWTService。

@Override 
public void init(ServletConfig config) throws ServletException { 
    super.init(config); 
    WebApplicationContext ctx = WebApplicationContextUtils 
      .getRequiredWebApplicationContext(config.getServletContext()); 
    AutowireCapableBeanFactory beanFactory = ctx 
      .getAutowireCapableBeanFactory(); 
    beanFactory.autowireBean(this); 
} 

GWT-SL庫的另一種方法來暴露Spring管理bean作爲GWT遠程服務。

+0

LEGEND!太感謝了。完美的作品。 –