【发布时间】:2015-05-04 08:18:13
【问题描述】:
我目前正在将使用 SimpleFormController 的旧 (2.x) Spring web mvc 应用程序更改为现在使用 Spring 3.2.13 并由注释驱动。这是进入 Spring 4 的垫脚石。Web 应用程序有一个依赖 jar 文件,其中包含多个控制器。我已经在 jar 文件中注释了控制器,但组件扫描没有拾取它们。我认为问题的根本原因是 WEB-INF/classes 目录与 jar 文件具有相同的根包结构。
例如,在 WEB-INF/classes 我有一个控制器:
com.myapp.common.package1.ControllerA
在 jar 文件中我有第二个控制器:
com.myapp.common.package2.ControllerB
在我的 servlet 的上下文文件中,我有:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:component-scan base-package="com.myapp"/>
<mvc:annotation-driven />
....
</beans>
Spring 未检测到 ControllerB 类。 Jar 文件使用目录条目,如果我将另一个控制器添加到具有不同包结构(例如 com.myapp.mvc.ControllerC)的 jar 文件中,Spring 会检测到它。
我猜是因为 Spring 已经扫描了 WEB-INF/classes (com.myapp.common) 下的一个目录结构,它忽略了 jar 文件中的类似目录结构。我的假设正确吗?有没有办法告诉 Spring 扫描在类路径中具有不同根的类似目录条目?我认为我必须做的一些选择是:
- 在 Web 应用程序或生成 jar 的依赖项目中更改控制器的包结构。
- 将 jar 文件解压到 Web 应用程序的 classes 目录中。
- 将 Web 应用程序中的类添加到 jar 文件中。
在我走上其中一条路之前,我想确保自己没有失踪 一些简单的东西。谢谢。
【问题讨论】:
-
当你说 base-package 是
com.myapp时,它会从这个包开始扫描所有子文件夹并注册任何带有适当注释的bean,所以这应该不是问题。你的 JAR 在哪里包含第二个控制器?是在 WEB-INF/lib 里面吗? -
是的,它在 WEB-INF/lib 中。 Spring 会在同一个 jar 文件中查找其他控制器,只要它们的包结构与 WEB-INF/classes 下的控制器不同。
-
那些没有被Spring注册的控制器,在类的上面有@Controller注解吗?
-
是的。我刚刚尝试了一个测试,我将捆绑在 jar 中的控制器移动到不同的包(例如 com.myapp.test.ControllerB),然后 Spring 加载了它。我所做的只是移动它。我认为我可以将它们移动到单独的 WAR 文件中,然后将其用作所有遗留 Web 应用程序的覆盖(通过 maven),而不是移动 Jar 文件中的控制器。
-
这很奇怪,如果你在正确的地方有正确的注释类,那么它应该可以工作。你有什么例外吗?
标签: java spring-mvc jar