问题描述:
在查询sql的时候遇到报错:
1 | org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression 'groupStatusList != null and groupStatusList.size() > 0'. Cause: org.apache.ibatis.ognl.MethodFailedException: Method "size" failed for object [0] [java.lang.IllegalAccessException: Class org.apache.ibatis.ognl.OgnlRuntime can not access a member of class com.google.common.primitives.Ints$IntArrayAsList with modifiers "public"] | |
对应的代码部分为:
1 | groupBuyExtendMapper. |
问题分析:
从规范及用法上来看,并没有什么问题,检查后发现在源码中:
1 | public static Object invokeMethod(Object target, Method method, Object[] argsArray) |
method实际上是一个共享变量,也就是例子中的
public int java.util.Collections$SingletonList.size()方法
当第一个线程t1至(1)行代码允许method方法可以被调用,第二个线程t2执行至(2)将method的方法设置为不可以访问。接着t1又开始执行到(3)行的时候就会发生该异常。
解决方法:
mybatis3.2.x版本引用ognl的版本为2.6.9,Modifier.isPublic存在问题,ognl2.7版本已经修复,所以要将mybatis版本升级到mybatis3.3.x以上即可