복붙노트

[SPRING] ArrayOutOfBoundsException : asm.ClassReader.readClass (알 수없는 소스) [duplicate]

SPRING

ArrayOutOfBoundsException : asm.ClassReader.readClass (알 수없는 소스) [duplicate]

다음 의존성을 가진 계층 구조가 있습니다.

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로 사용하더라도 종속성이없는 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!");
    }
}

해결법

  1. ==============================

    1.코드가 상속되었으므로 다음 종속성의 버전을 간과했습니다.

    코드가 상속되었으므로 다음 종속성의 버전을 간과했습니다.

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

    4.2.4.RELEASE 을 설정하면 문제가 해결되었습니다.

  2. from https://stackoverflow.com/questions/35046404/arrayoutofboundsexception-asm-classreader-readclassunknown-source by cc-by-sa and MIT license