【问题标题】:Weblogic, beans aren't found by SpringWeblogic,Spring找不到bean
【发布时间】:2013-01-08 10:27:41
【问题描述】:

我们有一个使用 Spring 3 的 Web 应用程序。我们必须将它从 Tomcat 7 迁移到 Weblogic 10。

这个应用程序的结构是:

  • 一个核心模块,它包含所有的应用程序逻辑。此模块被打包为 jar。
  • 一个网络模块,它定义了所有的网络服务。该模块包含前一个作为依赖项,并通过在“contextConfigLocation”参数中包含核心模块上下文来使用其 bean。

我正在使用 maven,这是在 web 模块中定义依赖项的方式:

<dependency>
    <groupId>com.example</groupId>
    <artifactId>module-core</artifactId>
    <version>${project.version}</version>
    <classifier>${environment}</classifier>
</dependency>

该应用程序在 tomcat 中运行良好,但无法在 Weblogic 中部署,因为 Spring 无法创建任何依赖于 core-module.jar 中的 bean 的 bean。对于来自核心模块的所有 bean,错误总是相同的:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'xxxBean' is defined

'xxxBean' 是 core-module.jar 中定义的任何 bean。如果我删除 ref 以避免该 bean 的问题,则下一个引用的 bean 将再次引发错误。我的意思是 Spring 找到了在 web-module 本身中定义的所有 bean,但没有在 core-module 中定义。

在错误的跟踪中,我可以看到 weblogic 正在使用这个:

com.oracle.weblogic.wsee.wrapper.org.springframework.web.context.ContextLoaderListener.contextInitialized

所以问题可能与 Weblogic 为 Spring 应用程序引入的包装器有关。

关于可以解决此问题的配置有什么想法吗?谢谢!

【问题讨论】:

  • 你真的有名为xxxBean的bean吗?也许你只是不小心留下了一些评论或类似的东西。尝试在您的部署中搜索该字符串。
  • 不,这是一个虚构的名字。我使用它是因为问题发生在应用程序的任何 bean 上。如果我评论一个 bean,下一个引用的 bean 就会出现问题。
  • 你如何定义 web 模块和核心之间的依赖关系?
  • 我使用的是 maven,我在问题中添加了 this 的定义。谢谢!
  • 我的意思是您的 Web 服务在 WAR 中,而核心模块在该 WAR 的 WEB-INF/lib 中?或者您的 Web 服务是否在 JAR 中

标签: spring tomcat weblogic weblogic-10.x


【解决方案1】:

最后,问题与如何在 web.xml 中定义不同的 xml 文件有关。在 tomcat 中运行良好的原始配置是:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath:core-context.xml
        classpath:spring-web-security.xml 
    </param-value>
</context-param>

还有新的:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:core-context.xml,classpath:spring-web-security.xml</param-value>
</context-param>

它们必须声明为逗号分隔而不是换行。由于weblogic没有报错xml的格式,所以找问题有点复杂。我希望这可以避免人们花时间在这种迁移上。问候和感谢!

【讨论】:

  • 就我而言,原因是使用** 而不是目录名称。我用classpath:spring/*-context.xml替换了classpath:**/*-context.xml
【解决方案2】:

classpath:core-module-applicationContext.xml 中的 contextConfigLocation 或任何实际调用的文件都应该可以工作。

您可以尝试使用此内容将 weblogic.xml 定义到 WEB-INF/ 中吗

<?xml version="1.0" encoding="UTF-8"?> <weblogic-web-app xmlns="http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bea.com/ns/weblogic/90 http://www.bea.com/ns/weblogic/90/weblogic- web-app.xsd"> <container-descriptor> <prefer-web-inf-classes>true</prefer-web-inf-classes> </container-descriptor> </weblogic-web-app>

为Weblogic 10修改它,本质上我们想将prefer-web-inf-classes设置为true

【讨论】:

  • 我试过这个,但同样的问题 :-( 顺便说一下,weblogic 文档说管理控制台中指定的值将优先于手动设置的值,但我没有找到我可以在控制台中查看它的位置。谢谢
  • 你尝试过所有组合吗:classpath*:appcontext.xmlclasspath:**/appcontext.xml 等?
  • 是的,我试过了。终于,今天早上我发现了问题。我有不同的应用程序上下文文件,一个用于核心 bean,另一个用于 Spring 安全性。我不得不用逗号分隔它们的定义,在 tomcat 中它们被一个新行分隔。问题是weblogic的错误与真正的问题无关。我会把它添加到问题中。非常感谢!!
猜你喜欢
  • 1970-01-01
  • 2022-11-10
  • 2018-12-13
  • 2018-10-01
  • 1970-01-01
  • 2017-12-13
  • 2019-07-16
  • 2017-11-05
相关资源
最近更新 更多