解决 Mybatis报错org.apache.ibatis.ognl.NoSuchPropertyException: XXXCriteria$Criterion.noValue

问题

这个noValue一定存在,但是报错。
场景就是存在并发的情况下,尤其是在服务刚刚启动的时候,就会发生这个异常。

但是很不幸,mybatis 3.4.1之前,用的 OGNL都是由这个问题。

分析

3.4.1 之前的版本的 OgnlRuntime,这里,第三个参数传0,则永远都是null。

public static final Object getMethodValue(OgnlContext context, Object target, String propertyName, boolean checkAccessAndExistence) throws OgnlException, IllegalAccessException, NoSuchMethodException, IntrospectionException { Object result = null; Method m = getGetMethod(context, target == null ? null : target.getClass(), propertyName); if (m == null) { m = getReadMethod(target == null ? null : target.getClass(), propertyName, 0); }

3.4.1 以及以后的版本:

解决 Mybatis报错org.apache.ibatis.ognl.NoSuchPropertyException: XXXCriteria$Criterion.noValue
 public static final Object getMethodValue(OgnlContext context, Object target, String propertyName, boolean checkAccessAndExistence) throws OgnlException, IllegalAccessException, NoSuchMethodException, IntrospectionException { Object result = null; Method m = getGetMethod(context, target == null ? null : target.getClass(), propertyName); if (m == null) { m = getReadMethod(target == null ? null : target.getClass(), propertyName, (Class[])null); }

显然 getReadMethod 这个地方的实现已经完全发生改变。


getGetMethod 存在 并发问题,线程不安全。

相关文章