You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 16:27:39