【发布时间】:2012-08-29 05:35:24
【问题描述】:
我有一个 3 层应用程序:Web 服务、服务层和域层。 Web 服务存在于 Web 应用程序 (WAR) 中。服务层和领域层是两个 JAR 项目。依赖项是:
web-service --> 服务层 --> 域层
在服务层,服务用@Service注解。在域层中,DAO 使用@Repository 进行注释。 Web 服务实现类使用服务层 JAR 的服务,因此它为每个自动注入的服务保留一个实例(@Autowired)。
在我的 POM 中明确定义了依赖项。当我在 Tomcat 上部署 WAR 时,出现以下异常:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.mycompany.project.services.MyService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:952)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:821)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:735)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:551)
... 37 more
我引用了 Spring 文档中的一个相关部分:
类路径包的扫描需要存在 类路径中的相应目录条目。构建 JAR 时 使用 Ant 时,请确保您没有激活仅文件开关 JAR 任务。
我已经检查过,服务层 JAR 存在于 WEB-INF/lib 目录中。
有什么想法吗?
谢谢
编辑: 我只有一个上下文文件,它位于src/main/webapp/WEB-INF 下的 Web 服务层项目 (WAR) 中。在这种情况下,我启用了类路径扫描,如下所示:
<context:component-scan base-package="com.mycompany.project" />
包com.mycompany.project是我项目的基础包,下面有web-service(com.mycompany.project.server)、service-layer(com.mycompany.project.services)和domain-layer(com.mycompany.project.domain)包。
我已经解决了这个问题。我不明白为什么我所做的会导致这样的问题。每个服务都实现了一个定义其公共方法的接口。在我的 Web 服务实现类中,对服务的引用使用了实现类而不是接口。我只是将它们更改为使用界面,我不再遇到问题了。谁能解释一下使用服务实现类而不是自动装配接口有什么问题?
【问题讨论】:
-
这里可能会发生很多事情。一种可能的可能性是您的 Web 层上下文对服务层上下文一无所知。或者您没有在服务层上下文中进行组件扫描。要回答这些问题,您需要发布您的上下文文件。
-
请贴出你配置组件扫描的spring配置部分。
-
另外:查看异常报告的结尾。 Spring 递归地报告 bean 实例化失败,报告中的最后一个 bean 是问题所在(它阻止实例化报告中更高的任何 bean)。
-
我已经编辑了我的问题。