Spring Boot2深入分析解决java.lang.ArrayStoreException异常
将某个项目从spring boot1升级spring boot2之后出现如下报错,查了很多不同的解决方法都没有解决:
spring boot2项目启动时遇到了异常:
java.lang.arraystoreexception: sun.reflect.annotation.typenotpresentexceptionproxy
caused by: java.lang.arraystoreexception: sun.reflect.annotation.typenotpresentexceptionproxy at sun.reflect.annotation.annotationparser.parseclassarray(annotationparser.java:724) ~[na:1.8.0_65] at sun.reflect.annotation.annotationparser.parsearray(annotationparser.java:531) ~[na:1.8.0_65] at sun.reflect.annotation.annotationparser.parsemembervalue(annotationparser.java:355) ~[na:1.8.0_65] at sun.reflect.annotation.annotationparser.parseannotation2(annotationparser.java:286) ~[na:1.8.0_65] at sun.reflect.annotation.annotationparser.parseannotations2(annotationparser.java:120) ~[na:1.8.0_65] at sun.reflect.annotation.annotationparser.parseannotations(annotationparser.java:72) ~[na:1.8.0_65] at java.lang.class.createannotationdata(class.java:3521) ~[na:1.8.0_65] at java.lang.class.annotationdata(class.java:3510) ~[na:1.8.0_65] at java.lang.class.createannotationdata(class.java:3526) ~[na:1.8.0_65] at java.lang.class.annotationdata(class.java:3510) ~[na:1.8.0_65] at java.lang.class.getannotation(class.java:3415) ~[na:1.8.0_65] at java.lang.reflect.annotatedelement.isannotationpresent(annotatedelement.java:258) ~[na:1.8.0_65] at java.lang.class.isannotationpresent(class.java:3425) ~[na:1.8.0_65] at org.springframework.core.annotation.annotatedelementutils.hasannotation(annotatedelementutils.java:570) ~[spring-core-5.0.9.release.jar:5.0.9.release] at org.springframework.web.servlet.mvc.method.annotation.requestmappinghandlermapping.ishandler(requestmappinghandlermapping.java:177) ~[spring-webmvc-5.0.9.release.jar:5.0.9.release] at org.springframework.web.servlet.handler.abstracthandlermethodmapping.inithandlermethods(abstracthandlermethodmapping.java:218) ~[spring-webmvc-5.0.9.release.jar:5.0.9.release] at org.springframework.web.servlet.handler.abstracthandlermethodmapping.afterpropertiesset(abstracthandlermethodmapping.java:189) ~[spring-webmvc-5.0.9.release.jar:5.0.9.release] at org.springframework.web.servlet.mvc.method.annotation.requestmappinghandlermapping.afterpropertiesset(requestmappinghandlermapping.java:136) ~[spring-webmvc-5.0.9.release.jar:5.0.9.release] at org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.invokeinitmethods(abstractautowirecapablebeanfactory.java:1758) ~[spring-beans-5.0.9.release.jar:5.0.9.release] at org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.initializebean(abstractautowirecapablebeanfactory.java:1695) ~[spring-beans-5.0.9.release.jar:5.0.9.release] ... 16 common frames omitted
经过简单排查后,怀疑是因为jar版本冲突引起的异常,使用异常断点:
然后在
应该是从class org.activiti.spring.boot.securityautoconfiguration出错,然后报错java.lang.arraystoreexception: sun.reflect.annotation.typenotpresentexceptionproxy
尝试复现异常:
securityautoconfiguration securityautoconfiguration=new securityautoconfiguration();
正常
securityautoconfiguration.class.getdeclaredannotation(aspect.class);
异常复现。
然后找到typenotpresentexceptionproxy类,使用ctrl+n/ctrl+n+n
然后在构造方法中打断点,发现:
发现是cause:defaultauthenticationeventpublisher找不到引发的报错。
实际报错是classnotfound。
仔细看下代码,可以发现annotationparser.parseclassvalue
把异常包装成为object。
private static object parseclassvalue(bytebuffer buf, constantpool constpool, class<?> container) { int classindex = buf.getshort() & 0xffff; try { try { string sig = constpool.getutf8at(classindex); return parsesig(sig, container); } catch (illegalargumentexception ex) { // support obsolete early jsr175 format class files return constpool.getclassat(classindex); } } catch (noclassdeffounderror e) { return new typenotpresentexceptionproxy("[unknown]", e); } catch (typenotpresentexception e) { return new typenotpresentexceptionproxy(e.typename(), e.getcause()); } }
然后在sun.reflect.annotation.annotationparser.parseclassarray(int, bytebuffer, constantpool, class<?>)
里尝试直接设置到数组里。
而这里数组越界了,arraystoreexception
只有越界的object
的类型信息,也就是上面的。
解决:
- 1:将springboot2.0降级为原来的1.x版本
- 2:在springboot启动类上添加
@springbootapplication(exclude = securityautoconfiguration.class)
- 3:修改源码的集成问题,重新编译
总结:
具体问题还要具体分析,不同的代码引发该问题的原因也不相同。
我的问题是:
springboot2.0不能与activiti6.0.0直接集成使用,因为activiti6.0.0出来的时候springboot2.0还没有出来,activiti6.0.0 支持springboot1.2.6以上,2.0.0以下的版本。
这里实际报错是classnotfound。
到此这篇关于spring boot2深入分析解决java.lang.arraystoreexception异常的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。
下一篇: Unix/Linux fork隐藏的开销
推荐阅读
-
Spring Boot解决Required String parameter xxx is not present类型异常
-
No plugin found for prefix spring-boot in the current project and in the plugin groups异常解决
-
Spring异常捕获且回滚事务解决方案
-
Spring Boot集成Druid出现异常报错的原因及解决
-
Spring 利用junit 测试@Service注解出现java.lang.NullPointerException异常解决
-
Spring Boot2深入分析解决java.lang.ArrayStoreException异常
-
Spring boot 数据源缺失异常解决方案
-
解决spring boot项目中Caused by: com.atomikos.icatch.RollbackException: Prepare: NO vote异常
-
Spring Boot下 org.hibernate.AnnotationException异常的一种解决方法
-
Spring异常捕获且回滚事务解决方案