【发布时间】: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