Gagal memuat ApplicationContext yang disebabkan oleh ArrayIndexOutOfBoundsException di ClassReader

Ketika saya menjalankan kelas tes Junit, pengecualian di bawah ini muncul? Bagaimana saya bisa mengatasi ini?

Failed to load ApplicationContext
java.lang.IllegalStateException: Failed to load ApplicationContext
    at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:157)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:321)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:211)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:288)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:290)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 8
    at org.springframework.asm.ClassReader.readUnsignedShort(Unknown Source)
    at org.springframework.asm.ClassReader.<init>(Unknown Source)
    at org.springframework.asm.ClassReader.<init>(Unknown Source)
    at org.springframework.asm.ClassReader.<init>(Unknown Source)
    at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:48)
    at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
    at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:101)
    at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:76)
    at org.springframework.context.annotation.ConfigurationClassUtils.checkConfigurationClassCandidate(ConfigurationClassUtils.java:70)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:233)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:203)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:617)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:446)
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:103)
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:1)
    at org.springframework.test.context.support.DelegatingSmartContextLoader.loadContext(DelegatingSmartContextLoader.java:228)
    at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:124)

kelas ujianku adalah

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:dispatcher-servlet.xml")

public class CandidateDAOImplTest{
@Autowired
    public CandidateDAO candidateService;


    @Test
    public void testGetCandidate() {...}
}

operator-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"
>

    <context:component-scan base-package="com.global" />

    <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basenames">
            <list>
                <value>mymessages</value>
            </list>
        </property>
    </bean>

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
            <value>database.properties</value>
    </property>
    </bean>


    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>


    <!-- Configures the @Controller programming model -->
    <mvc:annotation-driven />

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource">
            <ref bean="dataSource" />
        </property>
    </bean>


    <bean id="candidateService" class="com.global.dao.impl.CandidateDAOImpl">
        <property name="jdbcTemplate" ref="jdbcTemplate" />
    </bean>    

    <!-- Define a Transaction Manager -->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource">
            <ref bean="dataSource" />
        </property>
    </bean>

    <!-- Turn on support for transaction annotations -->
    <tx:annotation-driven transaction-manager="txManager"/>

</beans>

terletak di web/WEB-INF/dispatcher-servlet.xml.
Saya menggunakan netbeams ied 7.3 dan glassfish server 3.0


person deepak kumar    schedule 10.07.2013    source sumber
comment
Sungguh menyedihkan betapa banyak jawaban atas pertanyaan ini yang menunjukkan bahwa penjawab tidak dapat membaca jejak tumpukan.   -  person Raedwald    schedule 16.12.2014
comment
Saya mengalami masalah serupa dan memperbaikinya dengan menghapus ‹context:component-scan base-package=com.global /›, karena kami tidak terlalu membutuhkannya yang berfungsi untuk kami. Masih tidak tahu mengapa hal itu akan menimbulkan masalah.   -  person troutinator    schedule 23.04.2015


Jawaban (5)


Kemungkinan besar Anda memiliki ekspresi lambda di dalam salah satu kacang musim semi Anda. Rupanya, kacang spring 3 tidak dapat diinisialisasi jika ada lambda di suatu tempat di kodenya. Jika migrasi ke pegas 4 bukanlah suatu pilihan, coba tulis ulang ekspresi lambda Anda menggunakan kelas anonim, seperti

Function<A,B> lambda = new Function() {
    public B apply(A s) { ... }
}

atau pindahkan kode lambda dari spring bean. Saya memiliki masalah yang sama dan itu membantu saya, saya masih bisa menggunakan spring 3 dengan jre/jdk 8.

Hindari kegagalan ini:

 Caused by: java.lang.ArrayIndexOutOfBoundsException: 10348
    at org.springframework.asm.ClassReader.<init>(Unknown Source)
person andrii    schedule 26.10.2017

Anda belum menyatakan JDK mana yang Anda gunakan. Jika Anda menggunakan 1.8 maka Anda mungkin perlu memutakhirkan Spring ke 4 (atau 3.2.9+ seperti yang ditunjukkan yurez).

Lihat jawaban untuk pertanyaan ini: Java 1.8 ASM ClassReader gagal mengurai file kelas - mungkin karena versi file kelas Java baru yang belum didukung

person vegemite4me    schedule 19.03.2015
comment
Terima kasih, itu sangat membantu! - person Kirill Smirnov; 24.07.2016
comment
Berdasarkan jawaban kedua untuk pertanyaan terkait, memperbarui ke Spring 3.2.9+ juga berfungsi. - person yurez; 11.05.2018

Masalahnya adalah lokasi file xml Anda. WEB-INF bukan bagian dari jalur kelas. Coba salin di bawah folder "src".

person DiTap    schedule 11.08.2014

Coba letakkan file tersebut di bawah folder src. Kemudian akan disalin ke folder WEB-INF/classes. Kemudian Anda bisa merujuknya sebagai classpath:dispatcher-servlet.xml. Jika file tidak langsung berada di bawah direktori classes, maka Anda tidak dapat menggunakan lokasi tersebut sebagai classpath:dispatcher-servlet.xml dalam pengujian Anda

person Atul    schedule 15.10.2014

Tampaknya ada beberapa file kelas yang tidak valid di jalur kelas Anda.

Sebuah blog(http://blog.163.com/mxl_880310/blog/static/1847222162012320102631220/) (dalam bahasa Cina Tradisional) menjelaskan masalah serupa, penulis menyelesaikannya dengan memeriksa apakah ada file kelas ukuran nol.

person Yugang Zhou    schedule 10.07.2013
comment
Ini bukan jawaban hanya tautan, karena jawabannya memberikan ringkasan pidt blog yang ditautkan. - person Raedwald; 16.12.2014