21

我是 Spring 的新手,我正在尝试将 ServletContext 的 @Autowire 注释与我的类属性一起使用:

@Controller
public class ServicesImpl implements Services{

    @Autowired
    ServletContext context;

我在 dispatcher-servlet.xml 中为这个类定义了 bean:

<bean id="services" class="com.xxx.yyy.ServicesImpl" />

但是当我尝试运行 JUnit 测试时,会出现以下错误:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [javax.servlet.ServletContext] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

我认为 ServletContext 注入是使用 spring 自动进行的......我该如何解决这个问题?

谢谢!

编辑:我想使用 servletContext 来调用 getRealPath() 方法。有没有其他选择?

4

3 回答 3

27

实现ServletContextAware接口,Spring 将为您注入它

@Controller
public class ServicesImpl implements Services, ServletContextAware{


private ServletContext context;

public void setServletContext(ServletContext servletContext) {
     this.context = servletContext;
}
于 2013-02-15T14:59:26.893 回答
10

您可能想看看可用于单元测试的MockServletContext 。

于 2013-02-15T13:45:11.070 回答
3

ServletContext不是 Spring bean,因此除非您实现ServletContextAware.

如果一个人在模块或层中思考,那么 servlet 上下文不应该在 web 模块/层之外可用。我想您ServicesImpl是业务或服务层的一部分。

如果您提供更多背景信息,我们可能会提出更好的替代方案。

于 2013-02-15T13:39:52.363 回答