深⼊分析SpringBoot2,解决java.lang.ArrayStoreException异常
将某个项⽬从Spring Boot1升级Spring Boot2之后出现如下报错,查了很多不同的解决⽅法都没有解决:
Spring boot2项⽬启动时遇到了异常:
java.lang.ArrayStoreException: flect.annotation.TypeNotPresentExceptionProxy
Caused by: java.lang.ArrayStoreException: flect.annotation.TypeNotPresentExceptionProxy
flect.annotation.AnnotationParser.parseClassArray(AnnotationParser.java:724) ~[na:1.8.0_65]
flect.annotation.AnnotationParser.parseArray(AnnotationParser.java:531) ~[na:1.8.0_65]
flect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:355) ~[na:1.8.0_65]
flect.annotation.AnnotationParser.parseAnnotation2(AnnotationParser.java:286) ~[na:1.8.0_65]
flect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:120) ~[na:1.8.0_65]
flect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:72) ~[na:1.8.0_65]
at java.ateAnnotationData(Class.java:3521) ~[na:1.8.0_65]
spring framework版本
at java.lang.Class.annotationData(Class.java:3510) ~[na:1.8.0_65]
at java.ateAnnotationData(Class.java:3526) ~[na:1.8.0_65]
at java.lang.Class.annotationData(Class.java:3510) ~[na:1.8.0_65]
at java.Annotation(Class.java:3415) ~[na:1.8.0_65]
at flect.AnnotatedElement.isAnnotationPresent(AnnotatedElement.java:258) ~[na:1.8.0_65]
at java.lang.Class.isAnnotationPresent(Class.java:3425) ~[na:1.8.0_65]
at annotation.AnnotatedElementUtils.hasAnnotation(AnnotatedElementUtils.java:570) ~[spring-core-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at org.springframework.web.hod.annotation.RequestMappingHandlerMapping.isHandl
er(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.hod.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: flect.annotation.TypeNotPresentExceptionProxy
尝试复现异常:
SecurityAutoConfiguration securityAutoConfiguration=new SecurityAutoConfiguration();
正常
DeclaredAnnotation(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 = Short() & 0xFFFF;
try {
try {
String sig = UTF8At(classIndex);
return parseSig(sig, container);
} catch (IllegalArgumentException ex) {
// support obsolete early jsr175 format class files
ClassAt(classIndex);
}
} catch (NoClassDefFoundError e) {
return new TypeNotPresentExceptionProxy("[unknown]", e);
}
catch (TypeNotPresentException e) {
return new peName(), e.getCause());
}
}
然后在flect.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。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。