发生Cause: org.apache.ibatis.ognl.OgnlException: source is null for getProperty(null, \“userId\“)“

本文记录了一次使用MyBatis过程中遇到的问题,即在Mapper接口方法中未正确使用@param注解导致的异常。通过调整接口定义解决了SQL表达式评估错误的问题。

在我使用MyBatis中使用Mapper接口的时候MyBatis出现以下错误:

"nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression 'param.userId != null and param.userId !='' '. Cause: org.apache.ibatis.ognl.OgnlException: source is null for getProperty(null, \"userId\")",

而我的接口中是这样的

int selectXXXByUnionId(final Map<String, Object> param);

一开始我以为是Mapp.xml中的SQL语句中的判断逻辑出错了,然后仔细看看,认真对比过后并没有异常。

直到我回去再看Mapper接口才发现注解中@param注解没有标识到我的接口上面,修改后:

int selectXXXByUnionId(@Param("param") final Map<String, Object> param);

然后就解决这个问题了!

你遇到的错误: ``` Error evaluating expression 'sourceData.batteryId != null'. Cause: source is null for getProperty(null, "batteryId") ``` ### ❓错误原因: 这个错误说明你在 MyBatis 的 `<if>` 条件判断中引用了 `sourceData.batteryId`,但 `sourceData` 是 `null`,导致 MyBatis 无法访问 `batteryId` 属性。 这是 MyBatis 使用 OGNL 表达式时的常见问题,尤其是在动态 SQL 中判断嵌套对象属性时。 --- ### ✅ 解决方案: #### ✅ 方法一:使用 `<if test="sourceData != null and sourceData.batteryId != null">` 在访问嵌套属性前,**先判断对象是否为 null**,避免空指针异常。 ```xml <if test="sourceData != null and sourceData.batteryId != null"> AND battery_id = #{sourceData.batteryId} </if> ``` --- #### ✅ 方法二:使用 `@MapKey` 或 `@Param` 注解明确参数名(适用于 Java 代码传参) 如果你在 Mapper 接口中使用了多个参数对象,建议用 `@Param` 明确命名参数: ```java List<BatteryInfo> selectByCondition(@Param("sourceData") BatteryInfo sourceData); ``` 然后在 XML 中使用: ```xml <if test="sourceData != null and sourceData.batteryId != null"> AND battery_id = #{sourceData.batteryId} </if> ``` --- #### ✅ 方法三:使用 `Map` 传参(适合动态参数) 你可以将参数封装为 `Map`,这样可以避免对象为 `null` 导致的问题: ```java Map<String, Object> params = new HashMap<>(); params.put("sourceData", sourceData); // sourceData 可能为 null ``` XML 中同样使用: ```xml <if test="sourceData != null and sourceData.batteryId != null"> AND battery_id = #{sourceData.batteryId} </if> ``` --- ### ✅ 总结 | 问题 | 原因 | 解决方法 | |------|------|----------| | `source is null for getProperty(null, "batteryId")` | 访问了 `null` 对象的属性 | 在访问嵌套属性前先判断对象是否为 null | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值