2011-09-09 27 views
3

我不明白爲什麼自動裝配的DAO類在測試類中工作正常,但在servlet中不起作用。 web.xml文件加載正確的上下文配置,因爲我可以看到日誌,所以問題必須在我的applicationContext文件中。Autowire不能在servlets上工作

這是我的servlet:

@Controller 
public class TestAutowired extends HttpServlet { 
private static final long serialVersionUID = 1L; 

@Autowired 
private IUserDao uDao; 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     uDao.getUserById(1); 
} 
} 

,這是我的ApplicationContext(configuration.xml中):

<?xml version="1.0" encoding="UTF-8"?> 
<!-- Spring configuration --> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:jee="http://www.springframework.org/schema/jee" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xsi:schemaLocation=...> 

<context:component-scan base-package="com.firststepteam.dao"> 
    <context:include-filter type="annotation" 
     expression="org.springframework.stereotype.Repository"/> 
</context:component-scan> 

<context:component-scan base-package="com.firststepteam.services"> 
    <context:include-filter type="annotation" 
     expression="org.springframework.stereotype.Service"/> 
</context:component-scan> 

<context:component-scan base-package="com.firststepteam.servlet"> 
    <context:include-filter type="annotation" 
     expression="org.springframework.stereotype.Controller"/> 
</context:component-scan> 

<!-- View resolver -> JSP --> 
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 
    <property name="prefix" value="/WEB-INF/jsp/"/> 
    <property name="suffix" value=".jsp"/> 
</bean> 

<!-- PropertyPlaceholderConfigurer --> 
<bean id="placeHolder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations" value="classpath:hostingData.conf" /> 
</bean> 

<!-- DataSource --> 
<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="${jdbc.db.driverClassName}" /> 
    <property name="url" value="${jdbc.db.url}" /> 
    <property name="username" value="${jdbc.db.username}" /> 
    <property name="password" value="${jdbc.db.password}" /> 
</bean> 

<!-- JPA E HIBERNATE --> 
<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
    <property name="database" value="MYSQL" /> 
    <property name="generateDdl" value="true" /> 
</bean> 

<!-- ENTITY MANAGER FACTORY --> 
<bean id="dbEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="persistenceUnitName" value="fs_db" /> 
    <property name="jpaVendorAdapter" ref="jpaVendorAdapter" /> 
</bean> 

<tx:annotation-driven /> 
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="dbEntityManagerFactory" /> 
</bean> 

<bean class = "org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" /> 

</beans> 

任何暗示?

回答

2

servlet生命週期由容器管理,而不是Spring。

+0

那我該怎麼辦?我必須對web.xml進行更改? – Fabio

+0

使用Spring控制器而不是原始servlet。使用Spring DispatcherServlet將其委託給它們。此外,DAO不屬於servlet。 Spring成語擁有一個擁有DAO的服務層,並且知道事務和工作單元。將DAO連接到服務中,將服務連接到控制器,然後讓Spring DispatcherServlet路由請求。 – duffymo

相關問題