java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy

將某個項目從Spring Boot1升級Spring Boot2以後出現以下報錯,查了不少不一樣的解決方法都沒有解決:java

Spring boot2項目啓動時遇到了異常:web

java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxyspring

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版本衝突引發的異常,使用異常斷點:數組

而後在springboot

 

 

應該是從class org.activiti.spring.boot.SecurityAutoConfiguration出錯,而後報錯java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxymvc

嘗試復現異常:app

SecurityAutoConfiguration securityAutoConfiguration=new SecurityAutoConfiguration();

正常post

SecurityAutoConfiguration.class.getDeclaredAnnotation(Aspect.class);

異常復現。spa

而後找到TypeNotPresentExceptionProxy類,使用Ctrl+N/Ctrl+N+N3d

而後在構造方法中打斷點,發現:

發現是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。

相關文章
相關標籤/搜索