我有一个Eclipse“Dynamic Web Project”和一个在Eclipse中配置的Tomcat服务器来使用该项目。我有一个映射到servlet的文件扩展名,在servlet配置中我有一个像这样的组件扫描元素设置:
<context:component-scan base-package="com.mycompany.web" />
当我的Web服务器启动时,我在日志中看到此错误消息:
May 6, 2011 9:50:23 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Allocate exception for servlet cap
java.lang.IllegalArgumentException: Resource path [C:\...\src\main\webapp\WEB-INF\classes\com\mycompany\web] does not denote a directory
该目录不存在(打包的.war文件除外)。但是,com.mycompany.web包确实存在。
还有其他方法可以进行组件扫描吗?它需要查看另一个文件夹,或以某种方式在我的项目中找到它...
答案 0 :(得分:1)
似乎不可能以这种方式进行组件扫描。它做了一个目录列表,我认为当类文件没有物理上位于Spring所期望的位置时,这是不可能的。我只是通过不使用组件扫描,并在spring配置中列出控制器来解决这个问题:
<context:annotation-config />
<bean class="com.mycompany.web.MyController"/>
控制器中的注释仍然有效,因此手动列出控制器是唯一的额外步骤。
答案 1 :(得分:1)
可以做你想做的事,但你需要一些额外的配置。
您可以使用@Controller或@Repository或其他Spring构造型注释来注释您的类,Spring会自动选择它们。
或者你可以给context:component-scan
更多信息。例如:
<context:component-scan base-package="com.mycompany.web">
<!-- scan all classes in the com.mycompany.web package (but
not in subpackages) -->
<context:include-filter type="aspectj" expression="com.mycompany.web.*"/>
<!-- or if you want to include subpackages this config scans all
classes in com.mycompany.web.special and in its subpackages
(that's what the ..* means) -->
<context:include-filter type="aspectj" expression="com.mycompany.web.special..*"/>
</context:component-scan>
最后,如果您不喜欢使用aspectj,则上下文:include-filter的type
可以是正则表达式,自定义注释等。有关详细信息,请参阅this link。