ArrayOutOfBoundsException:asm.ClassReader.readClass(未知来源)

时间:2016-01-27 19:31:49

标签: java spring java-8 java-bytecode-asm

我有一个具有以下依赖关系的层次结构:

Base(Timer timer)

    Timer(PublisherService service, BaseDao userDao, DataProcessor processor)

DataProcessor中还有其他依赖项,但我不会那么远,因为看起来我的错误很早就发生了。与该依赖图相对应,我有以下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>

在我的应用程序的顶层,我将运行:

ApplicationContext context = new ClassPathXmlApplicationContext("spring-configuration.xml");

Base consumerBase = context.getBean("base", Base.class);

当我按照调试时发现Timer已成功初始化。 。 。有些。在Timer完全解析并注入Base之前,我会回复以下内容:

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)

我将它追溯到Main,这是我的堆栈跟踪中唯一的类。

删除Java和XML中的所有三个构造函数参数解决了这个问题,但是引入3个构造函数参数中的任何一个都会将其重新引出。例如,依赖图对DataProcessor更深一些,但即使我只使用BaseDao作为构造函数args,它本身没有依赖关系,我也会收到此错误。

知道这里发生了什么吗?我已经尝试了构造函数args的各种排列,创建了新的接口实现,以防我现有的东西导致问题冒出来,几乎所有的一切都不好意思,只是更仔细地从头开始重写。

编辑:

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

1 个答案:

答案 0 :(得分:3)

由于代码是继承的,我忽略了以下依赖的版本:

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

设置<spring.version>4.2.4.RELEASE</spring.version>解决了问题。