mybatis.spring.MyBatisSystemException There is no getter for property named ‘id‘ in‘class com.xx.xx‘

一、错误信息

1.控制台错误信息

2022-10-04 20:21:17.950|ERROR|8a0c871f6dec4ce3a494e63e0f55ef64|http-nio-8099-exec-8|com.dollycat.standard.response.CommunicationResponse|32|processException|运行时异常
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'id' in 'class com.dollycat.basic.page.Page'
	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
	at com.sun.proxy.$Proxy99.selectList(Unknown Source)
	at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230)
	at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:139)
	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:76)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
	at com.sun.proxy.$Proxy100.queryByPage(Unknown Source)
	at com.dollycat.system.service.impl.PrSysuserServiceImpl.queryByPage(PrSysuserServiceImpl.java:89)
	at com.dollycat.system.controller.admin.PrSysuserController.queryDict(PrSysuserController.java:61)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:891)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:866)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.github.xiaoymin.swaggerbootstrapui.filter.SecurityBasicAuthFilter.doFilter(SecurityBasicAuthFilter.java:84)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.github.xiaoymin.swaggerbootstrapui.filter.ProductionSecurityFilter.doFilter(ProductionSecurityFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at com.dollycat.system.auth.TokenFilter.doFilter(TokenFilter.java:71)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:66)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215)
	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.honeypotframework.trace.starter.filter.WebTraceIDFilter.doFilterInternal(WebTraceIDFilter.java:39)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
	at org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:96)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:41002)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'id' in 'class com.dollycat.basic.page.Page'
	at org.apache.ibatis.reflection.Reflector.getGetInvoker(Reflector.java:419)
	at org.apache.ibatis.reflection.MetaClass.getGetInvoker(MetaClass.java:164)
	at org.apache.ibatis.reflection.wrapper.BeanWrapper.getBeanProperty(BeanWrapper.java:162)
	at org.apache.ibatis.reflection.wrapper.BeanWrapper.get(BeanWrapper.java:49)
	at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:122)
	at org.apache.ibatis.scripting.xmltags.DynamicContext$ContextMap.get(DynamicContext.java:94)
	at org.apache.ibatis.scripting.xmltags.DynamicContext$ContextAccessor.getProperty(DynamicContext.java:108)
	at org.apache.ibatis.ognl.OgnlRuntime.getProperty(OgnlRuntime.java:2685)
	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.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:470)
	at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:434)
	at org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:44)
	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:292)
	at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:83)
	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
	at com.sun.proxy.$Proxy196.query(Unknown Source)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
	at sun.reflect.GeneratedMethodAccessor212.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:433)
	... 108 common frames omitted
2022-10-04 20:21:17.952|WARN|8a0c871f6dec4ce3a494e63e0f55ef64|http-nio-8099-exec-8|org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver|99|log|Resolved [org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'id' in 'class com.dollycat.basic.page.Page']

2.主要错误

nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'id' in 'class com.dollycat.basic.page.Page'

二、解决错误

1.字段名称映射

在这里插入图片描述
在这里插入图片描述

2.驼峰命名

在这里插入图片描述
在这里插入图片描述

3.封装判断条件需要通过封装对象引用

我的错误就是在这里
在这里插入图片描述
在这里插入图片描述

<think>好的,我现在要解决用户遇到的MyBatis异常:MyBatisSystemException,具体原因是ReflectionException,提示在java.lang.String类中没有名为'tableId'的getter方法。用户之前提到过类似的问题,比如传入表名或参数时出现的类似异常,所以需要参考之前的解决方案。 首先,我需要回忆MyBatis处理参数的方式。MyBatis在解析Mapper XML文件时,会通过OGNL表达式获取参数对象的属性。如果参数是基本类型或String,而XML中引用了不存在的属性,就会抛出这个异常。例如,用户可能在XML中使用了#{tableId},但传入的参数是String类型,自然没有tableId属性。 接下来,我需要查看用户之前的引用内容。用户提到过传入SQL表名导致的问题,以及使用MyBatisPlus时动态SQL传参的问题。之前的回答中提到了参数传递的方式,比如使用@Param注解或Map来传递参数,避免直接使用基本类型导致的问题。现在的问题类似,用户可能在Mapper方法中直接使用了String类型的参数,但在XML中引用了错误的属性名。 解决方法可能有几种:首先,检查Mapper接口的方法参数是否正确使用了@Param注解。如果参数是单个String类型,并且XML中使用的是其他属性名,需要确保两者一致,或者使用@Param指定参数名。其次,用户可能需要将参数封装成Map或者对象,这样在XML中可以通过属性名访问。例如,将参数改为Map,其中包含tableId作为键,或者在对象中有对应的getter方法。 另外,用户可能误用了${}和#{}的区别。${}是直接替换,可能会导致SQL注入,而#{}是预编译的。如果用户将表名或列名作为变量传递,可能需要使用${},但需要注意安全性问题。然而,这种情况下,如果参数是String类型,直接使用${value}可能有效,但需要确认参数名称是否正确。 还需要检查XML文件中对应的SQL语句是否正确引用了参数。例如,如果Mapper方法参数是@Param("tableId") String tableId,那么XML中应该使用#{tableId}。如果没有使用@Param,且参数是单个String,MyBatis默认会寻找_parameter或value,这时候在XML中使用#{value}或#{_parameter}可能解决问题。 用户提到的错误是缺少'tableId'的getter方法,所以问题出在参数传递和XML引用不匹配。可能的解决方案包括:使用@Param注解明确参数名,将参数封装成Map或对象,或者调整XML中的参数引用为正确的名称。同时,需要提醒用户注意参数传递的方式,避免直接使用基本类型导致的问题,特别是在动态SQL拼接时,确保属性名与参数结构一致。 最后,需要总结这些可能的解决方案,给出具体的步骤和示例代码,帮助用户一步步排查和解决问题,并生成相关问题以扩展他们的理解。</think>#### 问题原因分析 当MyBatis在解析Mapper XML时,发现参数对象(此处为`String`类型)**缺少对应属性名的getter方法**,导致无法绑定参数。以下是具体原因和解决方案: --- ### 核心原因 1. **直接使用基本类型参数** Mapper方法中若直接使用`String`类型参数,MyBatis会尝试从`String`对象中查找`tableId`属性(但`String`类没有该属性)[^2]。 $$ \text{错误示例:} \quad \text{User getUser(@Param("tableId") String id);} \quad \text{但XML中使用#{tableId}} $$ 2. **动态SQL拼接问题** MyBatis通过OGNL表达式解析参数属性,若参数为简单类型且未正确标注`@Param`,会默认使用`_parameter`或`value`作为键名。 --- ### 解决方案 #### 方法一:使用`@Param`明确参数名 ```java // Mapper接口定义 User selectByTableId(@Param("tableId") String tableId); // 明确参数名与XML占位符对应 // XML配置 <select id="selectByTableId" resultType="User"> SELECT * FROM your_table WHERE id = #{tableId} <!-- 名称匹配 --> </select> ``` #### 方法二:封装为Map传递动态参数 ```java // Java代码传递Map Map<String, Object> params = new HashMap<>(); params.put("tableId", "user_123"); userMapper.selectByDynamicParams(params); // Mapper接口 User selectByDynamicParams(Map<String, Object> params); // XML配置 <select id="selectByDynamicParams" resultType="User"> SELECT * FROM ${tableName} WHERE id = #{tableId} <!-- 支持动态表名 --> </select> ``` #### 方法三:使用DTO对象封装参数 ```java // 定义DTO对象 public class TableQueryDTO { private String tableId; // 必须提供getter方法 public String getTableId() { return this.tableId; } } // Mapper接口 User selectByDTO(TableQueryDTO dto); // XML配置 <select id="selectByDTO" resultType="User"> SELECT * FROM your_table WHERE id = #{tableId} </select> ``` --- ### 关键对比 | 场景 | 错误写法 | 正确写法 | |----------------------|------------------------------------|-----------------------------------| | 简单类型参数传递 | `#{tableId}` + `String参数` | `@Param("tableId")` + `#{tableId}`| | 动态表名/列名 | `#{tableName}`(预编译失效) | `${tableName}`(直接替换)[^1] | | MyBatisPlus条件构造 | `QueryWrapper`未设置参数别名 | 使用`lambda表达式`明确字段名 | --- ### 扩展知识 1. **`#{}`与`${}`的区别** - `#{param}`:预编译参数(防SQL注入),适合值传递 - `${param}`:直接替换文本,适合动态表名/列名[^1] 2. **MyBatis参数解析规则** - 单个简单类型参数:默认键名为`_parameter`或`value` - 多个参数或`@Param`标注:使用指定名称 --- #### 相关问题 1. MyBatis中`#{}`和`${}`占位符的使用场景有何区别? 2. 如何安全地在MyBatis中实现动态表名查询? 3. MyBatisPlus的LambdaQueryWrapper如何避免属性名硬编码? [^1]: 动态表名需用`${}`但需注意SQL注入风险 [^2]: 简单类型参数必须通过`@Param`或Map封装传递
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值