2014-06-05 31 views
1

由於某些原因,我可以在我的控制器中自動裝入,但不能在我創建的servlet中裝入。Spring MVC:Servlet中自動忽略

這是我的servlet的頂部:

@Component 
public class MyServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet { 

    @Autowired 
    private CobiService cobiService; 

在我的web.xml,這是相關配置:

<servlet> 
     <servlet-name>convservlet</servlet-name> 
     <servlet-class>com.gim.servlets.MyServlet</servlet-class> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>convservlet</servlet-name> 
     <url-pattern>/MyServlet</url-pattern> 
    </servlet-mapping> 

這是我的方式告訴春天來掃描組件:

<context:component-scan base-package="com.gim" /> 

由於某種原因,我的autowired對象cobiService爲null。我忘記了什麼嗎?我應該改變什麼?

+0

什麼是servlet的完全限定名稱?它在'com.gim'包中嗎? –

+0

com.gim.servlets.MyServlet – user1883212

回答

3

Servlet不是由Spring管理的,它們由Servlet容器管理(如Tomcat)。因此,Spring不能以普通的Spring方式向Servlet注入依賴。然而,你可以這樣做以下:

public class MyServlet extends javax.servlet.http.HttpServlet { 

    private CobiService cobiService; 

    @Override 
    public void init() throws ServletException { 
     super.init(); 
     ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext()); 
     cobiService = applicationContext.getBean(CobiService.class); 
    } 

} 
+0

爲什麼不使用'ContextAware'接口? –

+0

這是一個非常好的主意!你應該使用該代碼更新你的答案! – geoand

+1

我需要更新我的答案以使用Servlet容器而不是Java EE容器。我只是找不到合適的術語 –

1

有兩個servlet正在創建。當應用程序初始化並讀取web.xml文件中配置的<servlet>標記時,將由servlet容器/ Java EE容器創建一個。另一個將在Spring IOC容器在初始化時執行組件掃描時創建。

在這種情況下,第一個實例無法參與依賴項注入,因爲它並未在Spring IOC容器內創建。爲了參與依賴注入,一個bean必須由Spring IOC容器管理。當servlet容器/ Java EE容器實例化servlet時,它不知道Spring的IOC容器。

不幸的是,當一個請求進來滿足在web.xml文件爲servlet指定的url-pattern,該請求被重定向到由servlet容器/ Java EE容器創建的第一個實例,它是不是一個bean,而不是候選人用於自動裝配。

如果你從web.xml除去servlet和添加@RequestMapping註釋到servlet,第二個實例(其是能夠利用自動裝配一個實際的bean)將被用於在@RequestMapping fullfilling指定URL模式的請求,然而在那個時候你幾乎有一個控制器。

所以總之,我的建議是堅持Spring約定並使用控制器類。控制器類將匹配並超過Servlet提供的功能。

1

您可以覆蓋你的servletinit方法,並做

SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext (this); 

SpringBeanAutowiringSupport

有沒有必要做

implements javax.servlet.Servlet,由於您正在延伸HttpServlet