【问题标题】:ArrayOutOfBoundsException: asm.ClassReader.readClass(Unknown Source) [duplicate]ArrayOutOfBoundsException:asm.ClassReader.readClass(未知来源)[重复]
【发布时间】:2016-05-04 22:31:08
【问题描述】:

我有一个包含以下依赖项的层次结构:

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,它本身没有依赖关系,我也会得到这个错误。

知道这里发生了什么吗?我已经尝试了构造函数参数的各种排列,创建新的接口实现以防我现有的接口实现导致问题冒泡,几乎所有的事情都比从头开始更仔细地重写。

编辑:

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

【问题讨论】:

  • 显示Base的代码。
  • Base添加了代码
  • 你的 Spring 和 Java 版本是什么。谷歌:java.lang.ArrayIndexOutOfBoundsException:在 org.springframework.asm.ClassReader.readClass(Unknown Source)。您的问题与框架的字节码操作有关。
  • 这是问题所在,我正在使用继承的代码,Spring 在版本 3 中已更新到最新版本,现在可以使用了。
  • 您可以回答您的问题,为其他人详细说明解决方案。

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


【解决方案1】:

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

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

设置&lt;spring.version&gt;4.2.4.RELEASE&lt;/spring.version&gt; 解决了这个问题。

【讨论】:

  • 之前的版本是什么。你的其他依赖是什么?你的 Java 版本是多少?
  • 以前的版本是3.1.0.RELEASE,Java 版本为 1.8
  • 在哪个xml文件中?
  • @Siddharth pom.xml(maven 配置文件)。
猜你喜欢
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 2018-04-21
相关资源
最近更新 更多