MyBatis异常排查:MyDataVO中无variableData属性getter的原因
解决MyBatis异常:There is no getter for property named 'variableData' in 'MyDataVO'
问题原因
这个异常的核心是**<foreach>标签内部的OGNL表达式作用域解析混淆**:
当你在<foreach>里直接写#{commonData}时,旧版本MyBatis会优先从当前遍历的item(即variableData,类型为String[])中查找属性,但String[]没有commonData属性。此时旧版本解析逻辑出现错误,没有正确回退到根对象MyDataVO查找commonData,反而误将variableData当成根对象的属性名,尝试调用MyDataVO.getVariableData()——而你的VO类只定义了getVariableDataList(),因此抛出异常。
解决方案
提供三种可行的解决方式,按需选择:
1. 用_parameter明确指定根对象
在<foreach>内部访问外部VO属性时,通过_parameter直接指向根参数(MyDataVO实例):
<insert id="insertMyData" parameterType="MyDataVO"> INSERT INTO my_data_table (common_data, common_data2, variable_data1, variable_data2, variable_data3) VALUES <foreach collection="variableDataList" item="variableData" separator=","> ( #{_parameter.commonData}, #{_parameter.commonData2}, #{variableData[0]}, #{variableData[1]}, #{variableData[2]} ) </foreach> </insert>
2. 给Mapper参数添加@Param注解
在Mapper接口方法中给参数指定别名,通过别名明确访问根对象:
// Mapper接口方法 void insertMyData(@Param("myData") MyDataVO myDataVO);
修改SQL映射,通过别名引用根对象属性:
<insert id="insertMyData"> INSERT INTO my_data_table (common_data, common_data2, variable_data1, variable_data2, variable_data3) VALUES <foreach collection="myData.variableDataList" item="variableData" separator=","> ( #{myData.commonData}, #{myData.commonData2}, #{variableData[0]}, #{variableData[1]}, #{variableData[2]} ) </foreach> </insert>
3. 升级MyBatis版本
MyBatis 3.5+版本优化了OGNL作用域解析逻辑,在<foreach>内部可以直接访问外部参数,不会出现此类混淆。如果项目依赖允许,升级到最新稳定版即可直接解决问题。
内容的提问来源于stack exchange,提问作者Dentata
相关产品推荐
相关产品推荐

