mybatis - 引起:org.apache.ibatis.ognl.NoSuchPropertyException:
问题描述
我的项目使用mybatis插件,偶尔会出现如下错误!
我用的mybatis插件tk.mybatis.mapper 3.3.0版调用Mapper接口
tk.mybatis.mapper.common.Mapper.updateByExampleSelective(@Param("record") T var1, @Param("example") Object var2);
例子:
public interface EntiyObjectMapper extends Mapper<EntiyObject>{
}
我调用:
Example example = new Example(EntiyObject.class);
entiyObjectMapper.updateByExampleSelective(entiyObject,example)
根异常堆栈
Caused by: org.apache.ibatis.ognl.NoSuchPropertyException: com.xxx.xxx.batch.model.pojo.XXXXXXXInfo.masFlag
这个EntiyObject属性magFlag是存在的,99%的情况不会出现这个错误
我在google、mybatis官网和ogln官网都没有找到类似的问题
我找不到这个问题的具体原因!
这是完整的异常堆栈:
[pool-9-thread-5] 2018-05-26 16:05:01.677 [ERROR] [CaseProcess.java:65] - XXXXXXXXX handle failed:org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression 'record.masFlag != null'. Cause: org.apache.ibatis.ognl.NoSuchPropertyException: com.xxx.xxx.batch.model.pojo.XXXXXXXInfo.masFlag
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:75)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:371)
at com.sun.proxy.$Proxy20.update(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:254)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:55)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)
at com.sun.proxy.$Proxy30.updateByExampleSelective(Unknown Source)
at com.xxx.xxx.batch.center.service.BaseDataService.insertXXXXXXXInfo(BaseDataService.java:163)
at com.xxx.xxx.batch.center.service.BaseDataService.subsideBo(BaseDataService.java:44)
at com.xxx.xxx.batch.center.service.XXXX.XXXXCaseService.execute(XXXXCaseService.java:47)
at com.xxx.xxx.batch.center.service.XXXX.XXXXCaseService$$FastClassBySpringCGLIB$$39bfb230.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:721)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:656)
at com.xxx.xxx.batch.center.service.XXXX.XXXXCaseService$$EnhancerBySpringCGLIB$$608b51ee.execute(<generated>)
at com.xxx.xxx.batch.center.RoutingService.execute(RoutingService.java:70)
at com.xxx.xxx.batch.center.CaseProcess.process(CaseProcess.java:45)
at com.xxx.xxx.batch.mq.MQAccessBuilder$3.consume(MQAccessBuilder.java:101)
at com.xxx.xxx.batch.mq.ThreadPoolConsumer$1.run(ThreadPoolConsumer.java:94)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.ibatis.builder.BuilderException: Error evaluating expression 'record.masFlag != null'. Cause: org.apache.ibatis.ognl.NoSuchPropertyException: com.xxx.xxx.batch.model.pojo.XXXXXXXInfo.masFlag
at org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:46)
at org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateBoolean(ExpressionEvaluator.java:32)
at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:34)
at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33)
at org.apache.ibatis.scripting.xmltags.TrimSqlNode.apply(TrimSqlNode.java:55)
at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33)
at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:41)
at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:279)
at org.apache.ibatis.executor.statement.BaseStatementHandler.<init>(BaseStatementHandler.java:64)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.<init>(PreparedStatementHandler.java:39)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.<init>(RoutingStatementHandler.java:45)
at org.apache.ibatis.session.Configuration.newStatementHandler(Configuration.java:502)
at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:47)
at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:115)
at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:75)
at sun.reflect.GeneratedMethodAccessor636.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:63)
at com.sun.proxy.$Proxy73.update(Unknown Source)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:170)
at sun.reflect.GeneratedMethodAccessor633.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:358)
... 25 more
Caused by: org.apache.ibatis.ognl.NoSuchPropertyException: com.xxx.xxx.batch.model.pojo.XXXXXXXInfo.masFlag
at org.apache.ibatis.ognl.ObjectPropertyAccessor.getProperty(ObjectPropertyAccessor.java:151)
at org.apache.ibatis.ognl.OgnlRuntime.getProperty(OgnlRuntime.java:2420)
at org.apache.ibatis.ognl.ASTProperty.getValueBody(ASTProperty.java:114)
at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)
at org.apache.ibatis.ognl.ASTChain.getValueBody(ASTChain.java:141)
at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)
at org.apache.ibatis.ognl.ASTNotEq.getValueBody(ASTNotEq.java:50)
at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)
at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:494)
at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:458)
at org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:44)
... 49 more
请帮我!
解决方案
为了将来参考,这是一个已知问题。
见https://github.com/mybatis/mybatis-3/issues/623
TL;博士
- 升级到 MyBatis 3.4.2+和Java 1.8.0_25+ 应该可以解决这个问题。
- 如果您无法升级,似乎有一种解决方法。
推荐阅读
- amazon-web-services - What is the difference between Amazon managed Blockchain and Amazon Blockchain Templates?
- android - 如何在网格回收器视图中创建加号图标以添加图像?
- php - PHP set_time_limit() 的作用域是什么?
- sql-server - 如何使用动态查询获取表中的列数
- java - 如何在Java中将@写成字符串
- python - 关于修改python列表的初学者问题
- angular - Angular 使用 bsdatepicker 发布日期 1 天回到 asp.net 核心应用程序
- c++ - 如何捕获无效的用户输入
- sql-server - 获取两天之间的天数总和,不包括星期日
- laravel - 在 Laravel 中注册时的 Paypal 重定向