【问题标题】:Is there a good way to diagnose spring bean/service creation problem?有没有诊断spring bean/服务创建问题的好方法?
【发布时间】:2024-05-21 15:15:02
【问题描述】:

我的项目使用 spring 和 spring-dm 进行 bean/service 配置。当我尝试导入一个也使用 spring 进行 DI 的旧项目时,将不会创建 bean。

举例说明,

我首先在spring-appContext.xml中定义了一个url-alias

<bean name="xxxx" class="XRegistry" init-method="init">
    <property name="webRoot" value="/WebContent"></property>
    <property name="alias" value="/test"></property>
    <property name="cAliasPattern" value="/test/*.do" />
    <property name="conConfigFile" value="ddd.xml"/>
</bean>

在 ddd.xml 中,我用 /test/abc.do 之类的 url 定义了一些控制器 bean

在 Eclipse 中作为 OSGi 框架启动时不会发生错误。 但是当我尝试访问 URL(/test/abc.do) 时,遇到了“Unknown OSGi URL:”。

真正让我困惑的问题是我不清楚从哪里开始。我的 bundle 依赖于 spring bundle 并且有 appContext.xml 和 dispatcher.xml。只是一个正常的弹簧使用场景。

由于 spring 对我来说看起来像黑盒子,我只能尝试一些我能想到的其他可能的原因,但直到现在还没有解决它。有人知道如何监控 spring 启动过程或有用的日志吗?

谢谢。

编辑 在使用 spring-dm 时,您需要创建一个包含 log4j.properties 的新片段来启用日志记录。这可以帮助你跟踪 spring 启动错误。

正如我在第一个答案中解释的那样,找到了根本原因,两个选择,

  1. 对于那些同时存在于工作区和目标平台中的包,增加当前工作区中的包版本。发生错误时,您还应该查看依赖包
  2. 删除目标平台中的高版本包。

【问题讨论】:

  • 有人能给点建议吗?
  • 你没有提供足够的信息让任何人帮助你。您谈论的是“网址映射”。什么样的映射?您是如何尝试访问它的,为什么您希望它首先可用?
  • @Ryan,我想知道是否有诊断 Spring bean 创建问题的通用方法。关于我的问题,我在问题部分进行了更新以说明问题。是的,我访问了 URL(/test/abc.do) ,并且遇到了“未知 URL”。根据我对 spring 的使用,通过在 bundle 中定义一个经过验证的 spring 配置文件,然后在 spring ENV 中运行 bundle,spring 将处理所有后端工作。所以我希望能成功访问 URL。
  • 我认为您最好向了解您正在开发的应用程序的人寻求帮助。看来您对它的了解还不够,甚至无法描述您的问题。需要调查的一些事情:什么是“XRegistry”?使 URL 在 OSGi 容器中可用的机制是什么?
  • @Ryan,出于业务需求,我没有指定具体的 java 类名。我找到了根本原因,即服务的依赖项列表中的一个捆绑包由于某些配置错误而没有启动。但是我使用了一些愚蠢的方法,一一检查。无论如何,谢谢你的帮助。

标签: spring javabeans startup monitor creation


【解决方案1】:

你试过设置spring框架调试的日志级别吗?

例如

log4j.rootLogger=WARN, stdout
[...]
log4j.logger.org.springframework=DEBUG

这始终是我尝试诊断 bean 创建问题时的第一个起点。

【讨论】:

  • 是的,我创建了一个片段来附加 log4j 属性。然后就可以看到spring日志信息了。我们是用同样的方式,对吧?
  • 是的,它在创建 OSGi 服务时会显示一些 NPE 异常。我正在使用 spring 2.5.5 和 spring-osgi 1.1.0。我尝试导入spring源代码,创建导出包时发生NPE。但是,我的包明确导出包。这真的让我很困惑。但是如果你多次刷新工作空间,NPE 可能就消失了。所以这真的很棘手。
  • 你检查过NPE发生在哪个类以及对象是在哪里创建的吗?
  • 感谢上帝。我找到了根本原因。那是我使用了两个不同的框架。 1. Equuniox 用于 OSGi 环境 2. Spring-dm 用于动态服务。对于我的方案,工作区和目标平台中都存在捆绑包,并且目标中的捆绑包是当前工作区中的更高版本,equniox 将在当前工作区中激活捆绑包,但是 spring-dm 将采用高版本插件。当 spring 为这个 bundle 构建上下文时,它会发现导出的包为 null,因为它没有被激活。而且 spring-dm 2.5 也没有解决这个 NPE,所以问题就发生了。
  • @beny23,我不敢相信这没有更多的赞成票。我记得过去这样做但忘记了标志/语法/记录器名称。感谢您的信息。