java-Spring框架-类加载器关系
我遇到的问题可能与Spring /类加载器的关系有关. 我现在对这个问题的冗长表示歉意. 我有许多旧的Java应用程序,它们最初是编写的,旨在在专用JVM中运行.我们决定检查资源使用情况,即可以通过在单个JVM中运行多个应用程序来提高效率.在这种情况下,我写了一个专门针对我们的环境设计的容器管理器,它能够在容器(或沙箱)中运行每个应用程序.这种隔离容器的能力的基础当然是定制类加载器. 在我们遇到使用Spring框架的应用程序之前,所有方法都可以正常工作.我有一个带有片段的Spring配置文件,如下所示.
以下是Spring实例化bean时日志文件的片段. DEBUG [South Agent 1](DefaultSingletonBeanRegistry.java:162)-创建单例bean’MDDStructurPackager’的共享实例 DEBUG [South Agent 1](AbstractAutowireCapableBeanFactory.java:378)-创建bean’MDDStructurPackager’的实例 DEBUG [South Agent 1](AbstractAutowireCapableBeanFactory.java:453)-急速缓存bean’MDDStructurPackager’以允许解析潜在的循环引用 DEBUG [South Agent 1](AbstractBeanFactory.java:213)-返回单例bean’Logger’的缓存实例 调试[South Agent 1](CachedIntrospectionResults.java:242)-为类[abc.def.mdd.msg.alarm.huawei.MDDPackagerAlarmM2000]获取BeanInfo DEBUG [South Agent 1](CachedIntrospectionResults.java:258)-缓存类[abc.def.mdd.msg.alarm.huawei.MDDPackagerAlarmM2000]的PropertyDescriptors 调试[South Agent 1](CachedIntrospectionResults.java:267)-找到类型为[java.lang.Class]的bean属性’class’ 调试[South Agent 1](CachedIntrospectionResults.java:267)-找到类型为[java.lang.String]的bean属性’colectionDate’ DEBUG [South Agent 1](CachedIntrospectionResults.java:267)-找到类型为[abc.def.mdd.msg.MDDComponent]的bean属性’component’ 调试[South Agent 1](CachedIntrospectionResults.java:267)-找到类型为[java.lang.String]的bean属性’fileType’ 调试[南部代理1](CachedIntrospectionResults.java:267)-找到类型为[java.util.ArrayList]的bean属性’listCommonWords’ 调试[南部代理1](CachedIntrospectionResults.java:267)-找到类型为[java.util.ArrayList]的bean属性’listHeader’ 调试[South Agent 1](CachedIntrospectionResults.java:267)-找到类型为[abc.def.mdd.logger.Logger]的bean属性’logger’. 调试[South Agent 1](CachedIntrospectionResults.java:267)-找到类型为[java.util.Map]的bean属性’mapDelimiter’ 调试[南部代理1](CachedIntrospectionResults.java:267)-找到类型为[java.util.Map]的bean属性’mapElement’ 调试[South Agent 1](CachedIntrospectionResults.java:267)-找到类型为[java.lang.String]的bean属性’namePackager’ 调试[南部代理1](CachedIntrospectionResults.java:267)-找到类型为[java.lang.String]的bean属性’nameSpaceXMLSchema’ 调试[South Agent 1](CachedIntrospectionResults.java:267)-找到类型为[java.lang.String]的bean属性’nodeName’ 调试[南部代理1](CachedIntrospectionResults.java:267)-找到类型为[java.lang.String]的bean属性’packageXMLSchema’ 调试[南部代理1](CachedIntrospectionResults.java:267)-找到类型为[abc.def.mdd.channel.ProcessingLayerListener]的bean属性’processingLayerListener’ 调试[South Agent 1](CachedIntrospectionResults.java:267)-找到类型为[java.lang.String]的bean属性’realm’ 调试[South Agent 1](CachedIntrospectionResults.java:267)-找到类型为[java.lang.String]的bean属性’statesObject’ DEBUG [South Agent 1](AbstractAutowireCapableBeanFactory.java:406)-完成创建bean’MDDStructurPackager’的实例 DEBUG [South Agent 1](DefaultSingletonBeanRegistry.java:162)-创建单例bean’ListAlarmChannel’的共享实例 DEBUG [South Agent 1](AbstractAutowireCapableBeanFactory.java:378)-创建bean’ListAlarmChannel’的实例 DEBUG [South Agent 1](AbstractAutowireCapableBeanFactory.java:453)-急速缓存bean’ListAlarmChannel’以允许解析潜在的循环引用 DEBUG [South Agent 1](DefaultSingletonBeanRegistry.java:162)-创建单例bean’Jakarta’的共享实例 DEBUG [South Agent 1](AbstractAutowireCapableBeanFactory.java:378)-创建bean’Jakarta’的实例 DEBUG [South Agent 1](AbstractBeanFactory.java:213)-返回单例bean’MDDStructurPackager’的缓存实例 信息:CORBA_HUAWEI_M2KJKT_ALARM(23447542):在类路径中添加了“ /opt/app/abcdef/rt_dev/lib/logkit-1.2.jar”. 信息:CORBA_HUAWEI_M2KJKT_ALARM(23447542):在类路径中添加了“ /opt/app/abcdef/rt_dev/lib/avalon-framework-4.1.5.jar”. 信息:CORBA_HUAWEI_M2KJKT_ALARM(23447542):在类路径中添加了“ /opt/app/abcdef/rt_dev/lib/concurrent-1.3.2.jar”. 信息:CORBA_HUAWEI_M2KJKT_ALARM(23447542):在类路径中添加了“ /opt/app/abcdef/rt_dev/lib/antlr-2.7.2.jar”. 调试[South Agent 1](ConstructorResolver.java:195)- 以下是abc.def.mdd.channel.corba.M2000AlarmChannel类的构造函数的签名: 公共M2000AlarmChannel(MDDComponent componenet) 公共M2000AlarmChannel(字符串主机,int端口,字符串用户名,字符串密码,MDDComponent componenet) 类abc.def.mdd.msg.alarm.huawei.MDDPackagerAlarmM2000实现MDDComponent(bean MDDStructurPackager). 如您所见,Spring正在实例化一些bean即. MDDStructurPackager没有问题. 问题是实例化“ Jakarta” bean. 这些行的含义: ????创建文件[/opt/app/abcdef/rt_dev/etc/HUAWEI_M2KJKT_ALARM.xml]中定义的名称“ Jakarta”的bean时出错: ????通过索引为0的[java.lang.String]类型的构造函数参数表示的不满意依赖性: ????无法将类型[abc.def.mdd.msg.alarm.huawei.MDDPackagerAlarmM2000]的构造函数参数值转换为所需的类型[java.lang.String]: 不清楚.我不确定尝试确定适当的构造方法时类型混淆的原因.问题可能与接口MDDComponent的加载有关.如果两次被不同的类加载器加载,这些类加载器在类加载器层次结构中不相关,则可以想象与确定正确的构造函数有关的问题. 任何想法,我都感激不已. 谢谢 最佳答案
从错误消息中,听起来像Spring正在尝试使用此构造函数实例化该对象:
看起来Spring对要使用哪个构造函数感到困惑,可能是因为两个构造函数都具有MDDComponent参数(以某种方式,两个构造函数都将其作为最后一个参数,我很好奇这是否与Spring使用的逻辑有关.确定要使用哪个构造函数. 根据Spring manual,有些参数可以添加到< constructor-arg>中.帮助容器解析要使用哪个构造函数的元素: 您可以添加“类型”:
或者您可以添加索引:
(如果确实要,您可以同时指定两者) 添加这两者之一或两者都应有助于Spring解析要使用的构造函数. 作为必然结果,如果这样做没有帮助,您是否可以简单地更改XML定义以传递另一个Spring正在尝试使用的构造函数所需的参数? 顺便说一句,使用WMD中的quote标记可能会使您的问题更易读. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |