这个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 以及以后的版本:
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 存在 并发问题,线程不安全。