ArrayOutOfBoundsException: asm.ClassReader.readClass (Fuente desconocida) [duplicado]
Esta pregunta ya tiene una respuesta aquí:
Error al cargar ApplicationContext causado por ArrayIndexOutOfBoundsException en ClassReader 5 respuestasTengo una jerarquía con las siguientes dependencias:
Base(Timer timer)
Timer(PublisherService service, BaseDao userDao, DataProcessor processor)
Hay dependencias adicionales dentroDataProcessor
pero no iré tan lejos porque parece que mi error ocurre mucho antes. En correspondencia con ese gráfico de dependencia, tengo la siguiente configuración de Spring:
<bean id="base" class="com.apps.consumer.Base">
<constructor-arg name="timer" ref="consumerTimerTask"/>
</bean>
<bean id="consumerTimerTask" class="com.apps.consumer.ConsumerTimerTask">
<constructor-arg name="service" ref="tradePublisherService"/>
<constructor-arg name="userDao" ref="userDao"/>
<constructor-arg name="consumerDataProcessor" ref="consumerDataProcessor"/>
</bean>
<bean id="tradePublisherService" class="com.apps.consumer.common.TradePublisherService"/>
<bean id="userDao" class="com.apps.dao.UserDao"/>
<bean id="consumerDataProcessor" class="com.apps.consumer.ConsumerDataProcessor">
<!-- Additional constructor-args here for this guy -->
</bean>
En el nivel superior de mi aplicación, ejecutaré:
ApplicationContext context = new ClassPathXmlApplicationContext("spring-configuration.xml");
Base consumerBase = context.getBean("base", Base.class);
A medida que sigo la depuración, encuentro que elTimer
se inicializa con éxito . .algo. Antes deTimer
está completamente resuelto e inyectado en elBase
Vuelvo lo siguiente:
java.lang.ArrayIndexOutOfBoundsException: 3145
at org.springframework.asm.ClassReader.readClass(Unknown Source)
at org.springframework.asm.ClassReader.accept(Unknown Source)
at org.springframework.asm.ClassReader.accept(Unknown Source)
at org.springframework.core.LocalVariableTableParameterNameDiscoverer.visitConstructor(LocalVariableTableParameterNameDiscoverer.java:123)
at org.springframework.core.LocalVariableTableParameterNameDiscoverer.getParameterNames(LocalVariableTableParameterNameDiscoverer.java:89)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:984)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:886)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:479)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:600)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:140)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:984)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:886)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:479)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:557)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:842)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:416)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at com.apps.Main.contextInitialized(Main.java:39)
Lo estoy rastreando hastaMain
que es la única clase en el seguimiento de la pila que es mía.
La eliminación de los tres parámetros del constructor en Java y XML resuelve el problema, sin embargo, la introducción de cualquiera de los 3 argumentos del constructor lo devuelve. El gráfico de dependencia va un poco más profundo paraDataProcessor
por ejemplo, pero incluso si solo usoBaseDao
como el constructor argumenta, que en sí mismo no tiene dependencias, obtendré este error.
¿Alguna idea de lo que está pasando aquí? He intentado varias permutaciones de argumentos de constructor, creando nuevas implementaciones de interfaz en caso de que algo en mis existentes causara que el problema surgiera, casi todo es tímido de reescribir esto desde cero con más cuidado.
EDITAR:
public class Base {
private TimerTask consumerTimerTask;
private static Logger logger = LoggerFactory.getLogger(Base.class);
public Base(TimerTask timer) {
this.consumerTimerTask = timer;
}
/**
* Initialize the timer.
* @throws Exception
*/
public void initialize() throws Exception {
final int updateFrequency = 10000;
// Once all fields have been generated and prefs read, initialize the update process every number of seconds.
final Timer updateTimer = new Timer();
updateTimer.scheduleAtFixedRate(this.consumerTimerTask, 0, updateFrequency);
logger.info("Base initialized successfully!");
}
}