在Web项目中使用组件扫描

时间:2011-05-06 15:27:55

标签: spring-mvc eclipse-wtp

我有一个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包确实存在。

还有其他方法可以进行组件扫描吗?它需要查看另一个文件夹,或以某种方式在我的项目中找到它...

2 个答案:

答案 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