我是Spring的新手,我正在尝试使用带有class属性的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注入是自动弹簧...我该如何解决这个问题?
谢谢!
编辑:我想使用servletContext来调用getRealPath()方法。还有其他选择吗?
答案 0 :(得分:21)
实现ServletContextAware接口,Spring将为您注入
@Controller
public class ServicesImpl implements Services, ServletContextAware{
private ServletContext context;
public void setServletContext(ServletContext servletContext) {
this.context = servletContext;
}
答案 1 :(得分:10)
您可能希望查看可用于单元测试的MockServletContext。
答案 2 :(得分:3)
ServletContext
不是Spring bean,因此,除非您实现ServletContextAware
,否则不能注入它。
如果在模块或层中思考,那么servlet上下文不应该在Web模块/层之外可用。我认为您的ServicesImpl
构成了业务或服务层的一部分。
如果您提供更多背景信息,我们可以提出更好的选择。