通過簡單排查後,懷疑是由於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。