【问题标题】:Importing Spring beans from other Maven modules inside a WAR?从 WAR 中的其他 Maven 模块导入 Spring bean?
【发布时间】:2010-09-23 19:14:39
【问题描述】:

我有一个新的 Web 应用程序,它作为多模块 Maven 项目的一部分打包为 WAR。此 WAR 的 applicationContext.xml 引用从“服务”模块导入的 bean,而后者又从“dao”模块导入 bean。 applicationContext.xml 中的 import 语句如下所示:

<import resource="classpath*:service.xml" />

service.xml 文件中的文件如下所示:

<import resource="classpath*:dao.xml" />

Spring STS 和 Eclipse 都不会在我的 bean 文件中显示任何警告或错误。我到处引用进口的豆子。 Maven 构建工作正常,DAO 集成测试全部通过(它们使用 bean)。我还没有任何服务集成测试。

但是当我在 Jetty 中启动 WAR 时出现错误:

Error creating bean with name 'securityService' 
Cannot resolve reference to bean 'userDAO' while setting constructor argument

所有导入的 bean XML 文件都可以在 WEB-INF/lib 目录中各自的 JAR 文件中找到。实际上,引发错误的服务 bean 本身是在服务模块的 JAR 文件中的 service.xml 文件中定义的。

显然服务模块找不到它从 dao 模块导入的 bean。显然我不明白一些东西......这应该是这样吗?

【问题讨论】:

    标签: java spring servlets jar javabeans


    【解决方案1】:

    我为“org.springframework”启用了调试日志记录,以查看是否可以学到任何东西。我发现的消息表明 DAO bean 已创建,但也有消息称它们没有名称或 ID。

    我检查了文件,他们都有一个 id。那是什么?我检查了 XML 命名空间并看到:

    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
    

    并注意到它很旧(我使用的是 Spring 3.0.2)并将其更改为:

    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    

    一旦我更改了它,Spring 立即抛出了六个错误,这些错误是关于错误定义的 bean(但显然从未使用过)。一旦我修复了这些错误,一切都正常了。从那以后,我检查了整个系统,检查 Spring XML 文件命名空间版本。

    感谢大家的帮助。不敢相信我在这种愚蠢上浪费了一天!

    【讨论】:

    • 不敢相信我在这种愚蠢上浪费了一天时间 这不会是最后一次。根据我的经验,构建出色的功能所花费的时间比追踪看似无辜的愚蠢错误要少得多。
    【解决方案2】:

    classpath:thingy.xmlclasspath*:thingy.xml 表示法的区别在于前者使用标准的类路径机制来解析一个资源(使用ClassLoader.getResource(name)),而后者将使用ClassLoader.getResources(name) 来检索所有匹配的资源类路径,这个区别在你的情况下应该是无关紧要的,因为我猜类路径上只有一个 dao.xml 文件。

    我认为您的问题有所不同,您缺少前导斜杠。

    将其用于单个资源

    <import resource="classpath:/dao.xml" />
    

    这适用于多种资源

    <import resource="classpath*:/dao.xml" />
    

    【讨论】:

    • 非常了解星号,感谢您的链接。但是,放置前导斜杠没有任何效果。
    • 您是否验证了 xml 文件确实在 jar 中?
    • 是的。我打开war,然后找到jar,然后打开jar,找到xml文件,再打开xml文件,找到bean。
    • 那么我猜你将不得不调试 bean 定义解析器。在 org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(Element) 中放一个断点
    • 在设置断点之前,我决定启用调试日志记录。在日志中,我找到了一个提示,并根据它找到了根本原因。看答案....
    【解决方案3】:

    应该是这样的

    <import resource="classpath:service.xml"/>
    

    【讨论】:

    • 如果我这样做,那么 Spring STS、Eclipse 都会警告未定义的 bean,并且由于未定义的 bean,构建会导致集成测试失败。
    • 没问题。谢谢您的帮助。不幸的是,我仍然有同样的问题。但是,Spring STS、Eclipse 和 Maven 似乎并不介意缺少的星号!
    • @HDave 你的依赖结构是什么,你的 xml 文件直接在类路径中的 jar 中?
    • 是的。 service.xml 位于 WEB-INF/lib 中的 service.jar 中。它引用了persist.xml,它位于WEB-INF/lib 中的persist.jar 中。这几乎就像 Spring 有一个关于传递导入的错误......
    【解决方案4】:

    您是否有多个 applicationContexts 并且可能父上下文引用了子上下文中定义的 bean?

    【讨论】:

    • 据我所知,我只有一个 applicationContext 并且所有 bean 都应该在那个上下文中。
    猜你喜欢
    • 2011-04-11
    • 2013-07-10
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 2019-11-19
    • 2017-01-12
    • 2016-03-29
    • 1970-01-01
    相关资源
    最近更新 更多