2014-06-05 28 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