最近接手一个老项目,写了点新代码,跑单元测试的时候,发现报错,一个业务类报错,报错如下
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [E:WorkspacecontentcontentV10.5xxxxxmzss-servicetargetclassescomsuningmzssvideoservicebaseVContentService.class]; nested exception is java.lang.ArrayIndexOutOfBoundsException: 9578 at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:261) at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:242) at org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(ComponentScanBeanDefinitionParser.java:84) at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:73) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1419) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1409) at org.springframework.beans.factory.xml.DefaultBeanDefinitiondocumentReader.parseBeanDefinitions(DefaultBeanDefinitiondocumentReader.java:184) at org.springframework.beans.factory.xml.DefaultBeanDefinitiondocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitiondocumentReader.java:140) at org.springframework.beans.factory.xml.DefaultBeanDefinitiondocumentReader.registerBeanDefinitions(DefaultBeanDefinitiondocumentReader.java:111) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:243) at org.springframework.test.context.support.AbstractGenericContextLoader.loadBeanDefinitions(AbstractGenericContextLoader.java:205) at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:100) 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) at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:148) ... 27 more Caused by: java.lang.ArrayIndexOutOfBoundsException: 9578 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.type.classreading.SimplemetadataReader.(SimplemetadataReader.java:59) 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.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:237) ... 49 more
很明显就是一个spring启动,查找bean过程报错,但是 自己只在baseVContentService加了一个新方法,去掉的话,单元测试正常,所以抱着试试看的心态,查了下 Spring + ArrayIndexOutOfBoundsException
发现了这个文章
一个离奇的ArrayIndexOutOfBoundsException异常的排查过程
恰好发现这个老项目 也是 spring 3.2 的,当我把 stream语法去掉,测试代码运行正常,又一顿百度,这篇文章和我问题一样
由于spring3.x版本与jdk1.8不兼容导致的java.lang.ArrayIndexOutOfBoundsException: 22272
原因如下
在ASM的核心实现中ClassReader类:字节码的读取与分析引擎。它采用类似SAX的事件读取机制,每当有事件发生时,调用注册的ClassVisitor、AnnotationVisitor、FieldVisitor、MethodVisitor做相应的处理,在构建ClassReader实例时,它首先保存字节码二进制数组b,然后创建items数组,数组的长度在字节码数组的第8、9个字节指定.就是这个地方出现索引下标超出范围 在官网发现org.objectweb.asm 在spring3.x版本中对兰布达表达式出现了不兼容问题,因为兰布达必须要1.8以上版本,而在spring3.x中是不适用的。
怕升级spring版本导致项目问题,所以就不写java8语法了。。。



