Spring Boot2深入分析解决java.lang.ArrayStoreException异常

作者:谁将新樽辞旧月,今月曾经照古人 时间:2021-10-20 12:10:24 

将某个项目从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版本冲突引起的异常,使用异常断点:

Spring Boot2深入分析解决java.lang.ArrayStoreException异常

Spring Boot2深入分析解决java.lang.ArrayStoreException异常

然后在

Spring Boot2深入分析解决java.lang.ArrayStoreException异常

Spring Boot2深入分析解决java.lang.ArrayStoreException异常

Spring Boot2深入分析解决java.lang.ArrayStoreException异常

应该是从class org.activiti.spring.boot.SecurityAutoConfiguration出错,然后报错java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy

尝试复现异常:


SecurityAutoConfiguration securityAutoConfiguration=new SecurityAutoConfiguration();

正常


SecurityAutoConfiguration.class.getDeclaredAnnotation(Aspect.class);

Spring Boot2深入分析解决java.lang.ArrayStoreException异常

异常复现。

然后找到TypeNotPresentExceptionProxy类,使用Ctrl+N/Ctrl+N+N

Spring Boot2深入分析解决java.lang.ArrayStoreException异常

然后在构造方法中打断点,发现:

Spring Boot2深入分析解决java.lang.ArrayStoreException异常

发现是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。

来源:https://www.cnblogs.com/jiangwz/p/9711998.html

标签:SpringBoot2,解决,java,ArrayStoreException,异常
0
投稿

猜你喜欢

  • Java实现查找当前字符串最大回文串代码分享

    2023-07-30 04:05:02
  • 浅谈基于SpringBoot实现一个简单的权限控制注解

    2022-01-23 16:42:47
  • Java面向对象基础知识之封装,继承,多态和抽象

    2022-11-18 07:35:59
  • Java面试题及答案集锦(基础题122道,代码题19道)

    2023-11-25 12:36:17
  • SpringBoot配置Email发送功能实例

    2022-03-07 20:52:20
  • Springboot上传文件时提示405问题及排坑过程

    2022-12-13 03:03:58
  • Java properties 和 yml 的区别解析

    2023-04-01 22:28:09
  • MyBatis配置的应用与对比jdbc的优势

    2023-08-27 07:03:47
  • Java中Map集合的常用方法详解

    2021-12-31 16:05:54
  • ElasticSearch添加索引代码实例解析

    2023-11-21 03:41:04
  • Java中io流解析及代码实例

    2023-08-22 16:46:48
  • Java 格式化输出JSON字符串的2种实现操作

    2023-11-13 09:41:10
  • spring cloud Ribbon用法及原理解析

    2021-11-28 15:27:21
  • Android模块化中数据传递/路由跳转实现示例

    2023-06-29 03:12:06
  • Java技能点之SimpleDateFormat进行日期格式化问题

    2023-09-09 01:50:26
  • maven <repositories>标签和<pluginRepositories>标签的使用

    2022-09-26 01:06:33
  • Java 手写LRU缓存淘汰算法

    2023-03-03 00:11:19
  • Java数据结构BFS广搜法解决迷宫问题

    2023-12-03 16:04:33
  • JavaSE static final及abstract修饰符实例解析

    2021-07-01 10:54:54
  • IntelliJ IDEA中查看文件内所有已声明的方法(类似eclipse的outline)

    2021-08-06 00:39:39
  • asp之家 软件编程 m.aspxhome.com