2

我有一个 Eclipse“动态 Web 项目”和一个在 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 包确实存在。

是否有另一种方法来进行组件扫描?它需要在另一个文件夹中查找,或者以某种方式在我的项目中找到它或其他东西......

4

2 回答 2

1

似乎不可能以这种方式进行组件扫描。它做了一个目录列表,我猜当类文件不在Spring期望的物理位置时是不可能的。我只是通过不使用组件扫描来解决这个问题,并在 spring 配置中列出控制器,如下所示:

<context:annotation-config />
<bean class="com.mycompany.web.MyController"/>

控制器中的注释仍然有效,因此手动列出控制器是唯一的额外步骤。

于 2011-05-09T14:21:43.413 回答
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,context:include-filtertype可以是正则表达式、自定义注释等。有关更多信息,请参阅此链接

于 2011-07-19T16:15:45.853 回答