Не удалось загрузить ApplicationContext, вызванный ArrayIndexOutOfBoundsException в ClassReader

Когда я запускаю тестовый класс junit, возникает следующее исключение? Как я могу это решить?

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)

мой тестовый класс

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

public class CandidateDAOImplTest{
@Autowired
    public CandidateDAO candidateService;


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

диспетчер-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>

он находится по адресу web/WEB-INF/dispatcher-servlet.xml.
Я использую netbeams ied 7.3 и сервер Glassfish 3.0.


person deepak kumar    schedule 10.07.2013    source источник
comment
Удручает, как много ответов на этот вопрос указывают на то, что отвечающий не может прочитать трассировку стека.   -  person Raedwald    schedule 16.12.2014
comment
Я столкнулся с похожей проблемой и исправил ее, удалив ‹context:component-scan base-package=com.global /›, так как нам это на самом деле не нужно, и это сработало для нас. До сих пор понятия не имею, почему это может вызвать проблему.   -  person troutinator    schedule 23.04.2015


Ответы (5)


Скорее всего, у вас есть лямбда-выражение внутри одного из ваших бинов Spring. По-видимому, компоненты Spring 3 не могут инициализироваться, если где-то в их коде есть лямбда. Если переход на Spring 4 невозможен, попробуйте переписать свои лямбда-выражения, используя анонимные классы, например

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

или переместите лямбда-код из бина Spring. У меня была такая же проблема, и это помогло мне, я все еще мог использовать Spring 3 с jre/jdk 8.

Избегает этого сбоя:

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

Вы не указали, какой JDK вы используете. Если вы используете 1.8, вам может потребоваться обновить Spring до 4 (или 3.2.9+, как указал yurez).

См. ответ на этот вопрос: Java 1.8 ASM ClassReader не удалось проанализировать файл класса - возможно, из-за новой версии файла класса Java, которая еще не поддерживается

person vegemite4me    schedule 19.03.2015
comment
Спасибо, это было полезно! - person Kirill Smirnov; 24.07.2016
comment
За второй ответ на связанный вопрос также работает обновление до Spring 3.2.9+. - person yurez; 11.05.2018

Проблема заключается в расположении вашего xml-файла. WEB-INF не является частью пути к классам. Попробуйте скопировать его в папку "src".

person DiTap    schedule 11.08.2014

Попробуйте поместить файл в папку src. Затем он будет скопирован в папку WEB-INF/classes. Затем вы можете ссылаться на него как classpath:dispatcher-servlet.xml. Если файл не находится непосредственно в каталоге classes, вы не можете использовать это местоположение как classpath:dispatcher-servlet.xml в своем тесте.

person Atul    schedule 15.10.2014

Кажется, в вашем пути к классам есть какой-то недопустимый файл класса.

Блог(http://blog.163.com/mxl_880310/blog/static/1847222162012320102631220/) (на традиционном китайском языке) описывает аналогичную проблему, автор решает ее, проверяя, существует ли файл класса нулевого размера.

person Yugang Zhou    schedule 10.07.2013
comment
Это не ответ только по ссылке, так как ответ содержит сводку связанного pidt блога. - person Raedwald; 16.12.2014