我有一个具有以下依赖关系的层次结构:
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!");
}
}
答案 0 :(得分:3)
由于代码是继承的,我忽略了以下依赖的版本:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
设置<spring.version>4.2.4.RELEASE</spring.version>
解决了问题。