【问题标题】:Spring 3 component-scan with duplicate package structures具有重复包结构的 Spring 3 组件扫描
【发布时间】: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 扫描在类路径中具有不同根的类似目录条目?我认为我必须做的一些选择是:

  1. 在 Web 应用程序或生成 jar 的依赖项目中更改控制器的包结构。
  2. 将 jar 文件解压到 Web 应用程序的 classes 目录中。
  3. 将 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


【解决方案1】:

由于我不完全了解您的用例,我可能是错的,但通常所有控制器都是 WAR/EAR 文件的一部分。不知道为什么要将控制器捆绑到 JAR 文件中。

【讨论】:

  • 原因是这是一套遗留 Web 应用程序的一部分,它们共享一组通用控制器,这就是为什么它们被打包在一个 jar 中的原因。我认为另一种解决方案是将通用控制器移动到 Base WAR 项目中,并使用 Maven 的覆盖功能将通用控制器应用于所有 Web 应用程序。
猜你喜欢
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
  • 2015-01-13
  • 1970-01-01
相关资源
最近更新 更多