我遇到的问题可能与Spring /类加载器的关系有关.
我现在对这个问题的冗长表示歉意.
我有许多旧的Java应用程序,它们最初是编写的,旨在在专用JVM中运行.我们决定检查资源使用情况,即可以通过在单个JVM中运行多个应用程序来提高效率.在这种情况下,我写了一个专门针对我们的环境设计的容器管理器,它能够在容器(或沙箱)中运行每个应用程序.这种隔离容器的能力的基础当然是定制类加载器.
在我们遇到使用Spring框架的应用程序之前,所有方法都可以正常工作.我有一个带有片段的Spring配置文件,如下所示.
<bean id="MDDStructurPackager" class="abc.def.mdd.msg.alarm.huawei.MDDPackagerAlarmM2000">
<property name="logger">
<ref local="Logger"/>
</property>
<property name="realm">
<value>unpack</value>
</property>
</bean>
<bean id="Jakarta" class="abc.def.mdd.channel.corba.M2000AlarmChannel">
<constructor-arg>
<ref bean="MDDStructurPackager"/>
</constructor-arg>
<property name="interactionLayer">
<ref local="MDDInteractionLayer"/>
</property>
<property name="logger">
<ref local="Logger"/>
</property>
<property name="tempFile" value="/opt/app/abcdef/rt_dev/var/cache/dat/Huawei_M2000_Jakarta.dat"/>
<property name="host" value="M2000Jakarta.ior"/>
<property name="irpReference" value="clarity"/>
<property name="name" value="M2000Jakarta"/>
<property name="realm" value="Jakarta"/>
<property name="natAddress" value="99.999.99.9" />
</bean>
以下是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)-
忽略构造函数[public abc.def.mdd.channel.corba.M2000AlarmChannel(
java.lang.String,
诠释
java.lang.String,
java.lang.String,
com.citycorp.mdd.msg.MDDComponent
)抛出java.lang.Exception
]
‘Jakarta’的类型:org.springframework.beans.factory.UnsatisfiedDependencyException:
创建文件[/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]:
无法将类型[abc.def.mdd.msg.alarm.huawei.MDDPackagerAlarmM2000]的值转换为所需的类型[java.lang.String];
嵌套的异常是java.lang.IllegalArgumentException:
无法将类型[abc.def.mdd.msg.alarm.huawei.MDDPackagerAlarmM2000]的值转换为所需的类型[java.lang.String]:
找不到匹配的编辑器或转换策略
以下是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的加载有关.如果两次被不同的类加载器加载,这些类加载器在类加载器层次结构中不相关,则可以想象与确定正确的构造函数有关的问题.
任何想法,我都感激不已.
谢谢
布赖恩
public M2000AlarmChannel(String host,int port,String username,String password,MDDComponent componenet)
看起来Spring对要使用哪个构造函数感到困惑,可能是因为两个构造函数都具有MDDComponent参数(以某种方式,两个构造函数都将其作为最后一个参数,我很好奇这是否与Spring使用的逻辑有关.确定要使用哪个构造函数.
根据Spring manual,有些参数可以添加到< constructor-arg>中.帮助容器解析要使用哪个构造函数的元素:
您可以添加“类型”:
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg type="int" value="7500000"/>
<constructor-arg type="java.lang.String" value="42"/>
</bean>
或者您可以添加索引:
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg index="0" value="7500000"/>
<constructor-arg index="1" value="42"/>
</bean>
(如果确实要,您可以同时指定两者)
添加这两者之一或两者都应有助于Spring解析要使用的构造函数.
作为必然结果,如果这样做没有帮助,您是否可以简单地更改XML定义以传递另一个Spring正在尝试使用的构造函数所需的参数?
顺便说一句,使用WMD中的quote标记可能会使您的问题更易读.