Spring framework - relación del cargador de clases

Tengo un problema que probablemente esté relacionado con la relación Spring / class loader.

Me disculparé por la verbosidad de la pregunta ahora.

Tengo una serie de aplicaciones de Java heredadas que se escribieron originalmente y estaban destinadas a ejecutarse en una JVM dedicada. Decidimos al examinar el uso de los recursos que se podrían obtener eficiencias ejecutando múltiples aplicaciones dentro de una sola JVM. Dentro de ese contexto, escribí un administrador de contenedores diseñado específicamente para nuestro entorno que es capaz de ejecutar cada aplicación dentro de un contenedor (o caja de arena). La base de esta capacidad para aislar los contenedores es, por supuesto, un cargador de clases personalizado.

Todo funciona bien hasta que encontramos una aplicación que usa Spring Framework. Tengo un archivo de configuración de Spring con fragmentos como se muestra a continuación.

<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>


El siguiente es un fragmento del archivo de registro ya que Spring está instanciando los beans.

DEPURACIÓN [Agente Sur 1] (DefaultSingletonBeanRegistry.java:162) - Creando una instancia compartida de un solo bean 'MDDStructurPackager'

DEBUG [Agente Sur 1] (AbstractAutowireCapableBeanFactory.java:378) - Creando instancia del bean 'MDDStructurPackager'

DEPURACIÓN [Agente Sur 1] (AbstractAutowireCapableBeanFactory.java:453): almacenamiento en caché del bean 'MDDStructurPackager' para permitir la resolución de posibles referencias circulares

DEPURACIÓN [Agente Sur 1] (AbstractBeanFactory.java:213) - Devolución de la instancia en caché de Singleton Bean 'Logger'

DEBUG [Agente Sur 1] (CachedIntrospectionResults.java:242) - Obteniendo BeanInfo para la clase [abc.def.mdd.msg.alarm.huawei.MDDPackagerAlarmM2000]

DEPURACIÓN [Agente Sur 1] (CachedIntrospectionResults.java:258) - Caching PropertyDescriptors para la clase [abc.def.mdd.msg.alarm.huawei.MDDPackagerAlarmM2000]

DEPURACIÓN [Agente Sur 1] (CachedIntrospectionResults.java:267) - Se encontró la propiedad 'clase' de bean de tipo [java.lang.Class]

DEBUG [Agente Sur 1] (CachedIntrospectionResults.java:267) - Se encontró la propiedad de bean 'colectionDate' de tipo [java.lang.String]

DEPURACIÓN [Agente Sur 1] (CachedIntrospectionResults.java:267) - Se ha encontrado la propiedad 'componente' del bean del tipo [abc.def.mdd.msg.MDDComponent]

DEBUG [Agente Sur 1] (CachedIntrospectionResults.java:267) - Se encontró la propiedad de bean 'fileType' de tipo [java.lang.String]

DEBUG [Agente Sur 1] (CachedIntrospectionResults.java:267) - Se encontró la propiedad de bean 'listCommonWords' de tipo [java.util.ArrayList]

DEBUG [Agente Sur 1] (CachedIntrospectionResults.java:267) - Se encontró la propiedad de bean 'listHeader' de tipo [java.util.ArrayList]

DEBUG [Agente Sur 1] (CachedIntrospectionResults.java:267) - Se encontró la propiedad 'logger' del bean de tipo [abc.def.mdd.logger.Logger]

DEBUG [Agente Sur 1] (CachedIntrospectionResults.java:267) - Se encontró la propiedad de bean 'mapDelimiter' de tipo [java.util.Map]

DEPURACIÓN [Agente Sur 1] (CachedIntrospectionResults.java:267) - Se encontró la propiedad de bean 'mapElement' de tipo [java.util.Map]

DEBUG [Agente Sur 1] (CachedIntrospectionResults.java:267) - Se encontró la propiedad de bean 'namePackager' de tipo [java.lang.String]

DEBUG [Agente Sur 1] (CachedIntrospectionResults.java:267) - Se encontró la propiedad de bean 'nameSpaceXMLSchema' de tipo [java.lang.String]

DEBUG [Agente Sur 1] (CachedIntrospectionResults.java:267) - Se encontró la propiedad de bean 'nodeName' del tipo [java.lang.String]

DEPURACIÓN [Agente Sur 1] (CachedIntrospectionResults.java:267) - Se encontró la propiedad de bean 'packageXMLSchema' de tipo [java.lang.String]

DEBUG [Agente Sur 1] (CachedIntrospectionResults.java:267) - Se encontró la propiedad de bean 'ProcessingLayerListener' de tipo [abc.def.mdd.channel.ProcessingLayerListener]

DEPURACIÓN [Agente Sur 1] (CachedIntrospectionResults.java:267) - Se ha encontrado la propiedad 'bean' del reino [java.lang.String]

DEBUG [Agente Sur 1] (CachedIntrospectionResults.java:267) - Se encontró la propiedad de bean 'statesObject' de tipo [java.lang.String]

DEPURACIÓN [Agente Sur 1] (AbstractAutowireCapableBeanFactory.java:406) - Terminé de crear la instancia del bean 'MDDStructurPackager'

DEBUG [Agente Sur 1] (DefaultSingletonBeanRegistry.java:162) - Creando una instancia compartida del bean singleton 'ListAlarmChannel'

DEBUG [Agente Sur 1] (AbstractAutowireCapableBeanFactory.java:378) - Creando instancia del bean 'ListAlarmChannel'

DEPURACIÓN [Agente Sur 1] (AbstractAutowireCapableBeanFactory.java:453): almacenamiento en caché del bean 'ListAlarmChannel' para permitir la resolución de posibles referencias circulares

DEPURACIÓN [Agente Sur 1] (DefaultSingletonBeanRegistry.java:162) - Creación de una instancia compartida de singleton bean 'Jakarta'

DEPURACIÓN [Agente Sur 1] (AbstractAutowireCapableBeanFactory.java:378) - Creando instancia de bean 'Jakarta'

DEPURACIÓN [Agente Sur 1] (AbstractBeanFactory.java:213) - Devuelve la instancia en caché del bean singleton 'MDDStructurPackager'

INFORMACIÓN: CORBA_HUAWEI_M2KJKT_ALARM (23447542): Se agregó "/opt/app/abcdef/rt_dev/lib/logkit-1.2.jar" a la ruta de clase.

INFORMACIÓN: CORBA_HUAWEI_M2KJKT_ALARM (23447542): Se agregó "/opt/app/abcdef/rt_dev/lib/avalon-framework-4.1.5.jar" a la ruta de clase.

INFORMACIÓN: CORBA_HUAWEI_M2KJKT_ALARM (23447542): Se agregó "/opt/app/abcdef/rt_dev/lib/concurrent-1.3.2.jar" a la ruta de clase.

INFORMACIÓN: CORBA_HUAWEI_M2KJKT_ALARM (23447542): Se agregó "/opt/app/abcdef/rt_dev/lib/antlr-2.7.2.jar" a la ruta de clase.

DEBUG [Agente Sur 1] (ConstructorResolver.java:195) -
Ignorando el constructor [public abc.def.mdd.channel.corba.M2000AlarmChannel (
java.lang.String, int, java.lang.String, java.lang.String, com.citycorp.mdd.msg.MDDComponent) arroja java.lang.Exception]
del bean 'Jakarta': org.springframework.beans.factory.UnsatisfiedDependencyException:
Error al crear bean con el nombre 'Jakarta' definido en el archivo [/ opt / app / abcdef / rt_dev / etc / HUAWEI_M2KJKT_ALARM.xml]:
dependencia insatisfecha expresada a través del argumento constructor con índice 0 de tipo [java.lang.String]:
No se pudo convertir el valor de argumento del constructor de tipo [abc.def.mdd.msg.alarm.huawei.MDDPackagerAlarmM2000] al tipo requerido [java.lang.String]:
Error al convertir el valor de tipo [abc.def.mdd.msg.alarm .huawei.MDDPackagerAlarmM2000] al tipo requerido [java.lang.String];
la excepción anidada es java.lang.IllegalArgumentException: no se puede convertir el valor del tipo [abc.def.mdd.msg.alarm.huawei.MDDPackagerAlarmM2000] al tipo requerido [java.lang.String]:
no se encontraron editores coincidentes ni estrategias de conversión


Las siguientes son las firmas de los constructores para la clase abc.def.mdd.channel.corba.M2000AlarmChannel:

public M2000AlarmChannel (componente MDDComponent)

public M2000AlarmChannel (host de cadena, puerto int, nombre de usuario de cadena, contraseña de cadena, componente de componente MDD)

La clase abc.def.mdd.msg.alarm.huawei.MDDPackagerAlarmM2000 implementa MDDComponent (bean MDDStructurPackager).



Como puede ver, Spring está instanciando algunos de los frijoles, es decir. MDDStructurPackager sin problema.

El problema es crear instancias del bean 'Yakarta'.

Las implicaciones de las líneas:

Error al crear un bean con el nombre 'Yakarta' definido en el archivo [/opt/app/abcdef/rt_dev/etc/HUAWEI_M2KJKT_ALARM.xml]:

Dependencia insatisfecha expresada a través del argumento constructor con índice 0 de tipo [java.lang.String]:

No se pudo convertir el valor de argumento del constructor de tipo [abc.def.mdd.msg.alarm.huawei.MDDPackagerAlarmM2000] al tipo requerido [java.lang.String]:

No están claros. No estoy seguro de los motivos de la confusión de tipos al intentar determinar el constructor apropiado. Es posible que el problema esté asociado con la carga de la interfaz MDDComponent. Si fue cargado dos veces, por diferentes cargadores de clases que no están relacionados en la jerarquía del cargador de clases, podría imaginar problemas asociados con la determinación del constructor correcto.

Cualquier idea recibida con gratitud, estoy agarrando pajitas.

Gracias Bryan

Respuesta 1

Desde el mensaje de error, parece que Spring está intentando instanciar el objeto con este constructor:

public M2000AlarmChannel(String host, int port, String username, String password, MDDComponent componenet)

Parece que Spring está confundido sobre qué constructor usar, posiblemente porque ambos constructores tienen un MDDComponentparámetro (de alguna manera, ambos constructores tienen esto como su último parámetro, tengo curiosidad si eso tiene algo que ver con la lógica que Spring usa para determinar qué constructor usar. De todos modos ...).

Según el manual de Spring , hay parámetros que puede agregar al <constructor-arg>elemento para ayudar al contenedor a resolver qué constructor usar:

Puede agregar "tipo":

<bean id="exampleBean" class="examples.ExampleBean">
  <constructor-arg type="int" value="7500000"/>
  <constructor-arg type="java.lang.String" value="42"/>
</bean>

o puedes agregar un índice:

<bean id="exampleBean" class="examples.ExampleBean">
  <constructor-arg index="0" value="7500000"/>
  <constructor-arg index="1" value="42"/>
</bean>

(Probablemente pueda especificar ambos, si realmente quiere)

Agregar uno o ambos debe ayudar a Spring a resolver qué constructor usar.

Como corolario, si esto no ayuda, ¿puede simplemente cambiar la definición XML para pasar los parámetros requeridos para el otro constructor, el que Spring está tratando de usar?

Por cierto, puede hacer que su pregunta sea mucho más legible para usar las etiquetas de presupuesto dentro de WMD.

Respuesta: 2

En realidad, creo que lo es. El primer argumento de constructor que pasa al objeto Jakarta es del tipo abc.def.mdd.msg.alarm.huawei.MDDPackagerAlarmM2000, pero el ctor quiere una cadena. Haz que los tipos coincidan correctamente.

Se lee como un mensaje directo. ¿Qué me estoy perdiendo?

Asumiré de la estructura del paquete que esas son sus clases. ¿Cierto?

Respuesta: 3

Estoy tratando de desarrollar una aplicación Spring MVC con páginas JSP y me he encontrado con un problema. Es más un problema de creatividad que un problema de código, pero aquí va: la aplicación básicamente recibe ...

Si está definiendo una variable, parece ser perfectamente válido declarar / definir una variable de la siguiente manera: double [] [] output = {{0,0}, {1,0}}; Pero si devuelve un valor, parece ser ...

He leído (http://old.nabble.com/using-q%3D--,-adding-fq%3D-to26753938.html#a26805204): FWIW: limitar el número de filas por solicitud a 50, pero no limitar el comienzo no hace mucho ...

Vi una pregunta de entrevista de la siguiente manera: un número en la matriz se está duplicando. Encontrarlo La solución simple es la siguiente: for (int i = 0; i <n; i ++) {{dup = false; para (j = 0; j <n; j ++) {if (i! = ...