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異常的文章就介紹到這瞭。希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 解決因jdk版本引起的TypeNotPresentExceptionProxy異常
- Spring Boot打開URL出現signin問題的解決
- spring boot隻需兩步優雅整合activiti示例解析
- SpringBoot根據目錄結構自動配置Url前綴方式
- springcloud gateway 映射失效的解決方案