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异常的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • springboot解决java.lang.ArrayStoreException异常

    idea工具使用 Java Exception Breakpoint 添加异常断点,在IDE里,新建一个断点,类型是Java Exception Breakpoint 当断点起效时,查看AnnotationUtils.findAnnotation(Class<?>, Class<A>, Set<Annotation>) line: 686 函数的参数. 可以发现 clazz是 class com.github.pagehelper.autoconfigure.Mappe

  • Spring Boot深入排查 java.lang.ArrayStoreException异常

    java.lang.ArrayStoreException 分析 这个demo来说明怎样排查一个spring boot 1应用升级到spring boot 2时可能出现的java.lang.ArrayStoreException. demo地址:https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-ArrayStoreException demo里有两个模块,springboot1-starter和springboot

  • Springboot项目出现java.lang.ArrayStoreException的异常分析

    参考文献:https://www.jb51.net/article/232858.htm 使用springboot 2 构建项目,调试代码的时候出现了如下的报错信息 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/sp

  • 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.TypeNotPresentExcep

  • java.lang.ArrayStoreException异常的解决方案

    java.lang.ArrayStoreException异常 异常提示 java.lang.ArrayStoreException: java.lang.Boolean at java.util.stream.Nodes$FixedNodeBuilder.accept(Nodes.java:1222) at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) at java.util.Spliter

  • 使用IDEA异常断点来定位java.lang.ArrayStoreException的问题

    前言 最近对 base-spring-boot项目进行了升级.在将其用于应用开发中时遇到java.lang.ArrayStoreException的异常导致程序无法启动.平常开发过程中面对这种描述不够清楚,无法定位具体原因的问题该如何处理?本文分享通过使用IDEA异常断点来定位此类问题的方法. 启动程序时抛出如下异常,导致启动失败 org.springframework.beans.factory.BeanCreationException: Error creating bean with n

  • 解决java.lang.ClassCastException的java类型转换异常的问题

    在项目中,需要使用XStream将xml string转成相应的对象,却报出了java.lang.ClassCastException: com.model.test cannot be cast to com.model.test的错误. 原因: 项目中应该是采用了热部署,devtools,因为累加载器的不同所以会导致类型转换失败 措施: 在pom.xml中将以下代码注释掉: <dependency> <groupId>org.springframework.boot</g

  • Java中java.lang.ClassCastException异常原因及解决方法

    通常我们在 OOP 设计中都会使用到继承. ​​但是在继承对象之间的强制转换可能会遇到​​java.lang.ClassCastException​​异常的错误. 错误的日志如下: 19:58:25.010 [http-nio-8080-exec-5] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw

  • java.lang.ExceptionInInitializerError异常的解决方法

    今天在开发的过程中,遇到java.lang.ExceptionInInitializerError异常,百度查了一下,顺便学习学习,做个笔记 静态初始化程序中发生意外异常的信号,抛出ExceptionInInitializerError表明在计算静态初始值或静态变量的初始值期间发生异常. 要理解这个异常从Java类中的静态变量初始化过程说起,在Java类中静态变量的初始化顺序和静态变量的声明顺序是一致的.示例程序为: package com.lang.ininitialException; im

  • 完美解决java.lang.OutOfMemoryError处理错误的问题

    原因: 常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 3.代码中存在死循环或循环产生过多重复的对象实体: 4.使用的第三方软件中的BUG: 5.启动参数内存值设定的过小: 常见错误提示: 1.tomcat:java.lang.OutOfMemoryError: PermGen space 2.tomcat:java.lang.OutOfMemoryError: Java heap space 3

随机推荐