java-Spring框架-类加载器关系

我遇到的问题可能与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的加载有关.如果两次被不同的类加载器加载,这些类加载器在类加载器层次结构中不相关,则可以想象与确定正确的构造函数有关的问题.

任何想法,我都感激不已.

谢谢
布赖恩

最佳答案
从错误消息中,听起来像Spring正在尝试使用此构造函数实例化该对象:

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标记可能会使您的问题更易读.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍了spring的事务传播属性REQUIRED_NESTED的原理介绍,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。传统事务中回滚点的使...
今天小编给大家分享的是一文解析spring中事务的传播机制,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获...
这篇文章主要介绍了SpringCloudAlibaba和SpringCloud有什么区别,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。Spring Cloud Netfli...
本篇文章和大家了解一下SpringCloud整合XXL-Job的几个步骤。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。第一步:整合pom文件,在S...
本篇文章和大家了解一下Spring延迟初始化会遇到什么问题。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。List 坑列表 = new ArrayList(2);...
这篇文章主要介绍了怎么使用Spring提供的不同缓存注解实现缓存的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇...
本篇内容主要讲解“Spring中的@Autowired和@Resource注解怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学...
今天小编给大家分享一下SpringSecurity怎么定义多个过滤器链的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家
这篇文章主要介绍“Spring的@Conditional注解怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring的@Con...
这篇文章主要介绍了SpringCloudGateway的熔断限流怎么配置的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringCloud&nb...
今天小编给大家分享一下怎么使用Spring解决循环依赖问题的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考
这篇文章主要介绍“Spring事务及传播机制的原理及应用方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Sp...
这篇“SpringCloudAlibaba框架实例应用分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价
本篇内容主要讲解“SpringBoot中怎么使用SpringMVC”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习...
这篇文章主要介绍“SpringMVC适配器模式作用范围是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringMVC
这篇“导入SpringCloud依赖失败如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家...
这篇文章主要讲解了“SpringMVC核心DispatcherServlet处理流程是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来
今天小编给大家分享一下SpringMVCHttpMessageConverter消息转换器怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以...
这篇文章主要介绍“Spring框架实现依赖注入的原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring框架...
本篇内容介绍了“Spring单元测试控制Bean注入的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下