欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-10 15:11:29
将某个项目从spring boot1升级spring boot2之后出现如下报错,查了很多不同的解决方法都没有解决:spring boot2项目启动时遇到了异常:java.lang.arraystor...

将某个项目从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。

到此这篇关于spring boot2深入分析解决java.lang.arraystoreexception异常的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。