2011-10-06 93 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!太感谢了。完美的作品。 –