通过简单排查后,怀疑是由于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。