java spring java-8 java-bytecode-asm

java - ArrayOutOfBoundsException: asm.ClassReader.readClass(Fuente desconocida)



spring java-8 (1)

Tengo una jerarquía con las siguientes dependencias:

Base(Timer timer) Timer(PublisherService service, BaseDao userDao, DataProcessor processor)

Hay dependencias adicionales dentro de DataProcessor pero no DataProcessor 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 me parece que el Timer se inicializó con éxito. . .algo. Antes de que el Timer se haya resuelto por completo y se haya inyectado en la Base , recibo 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 hasta Main que es la única clase en el seguimiento de pila que es mía.

La eliminación de los tres parámetros del constructor tanto en Java como en XML resuelve el problema, sin embargo, la introducción de cualquiera de los 3 argumentos del constructor lo trae de vuelta. El gráfico de dependencia es un poco más profundo para DataProcessor por ejemplo, pero incluso si solo uso BaseDao como el constructor args, que a su vez no tiene dependencias, obtendré este error.

¿Alguna idea de lo que está pasando aquí? He intentado varias permutaciones de args de constructor, creando nuevas implementaciones de interfaz en caso de que algo en las existentes estuviera causando que el problema surgiera, casi todo lo que se puede evitar al reescribir esto desde cero más cuidadosamente.

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!"); } }


Siendo que el código fue heredado, pasé por alto la versión de la siguiente dependencia:

<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency>

El ajuste <spring.version>4.2.4.RELEASE</spring.version> solucionó el problema.