mybatis if BuilderException

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: 

Caused by: org.apache.ibatis.builder.BuilderException:

<if test="name != null and name != ''">
     AND name LIKE CONCAT('%',#{name},'%');
 </if>

注意if语句中的test中的and必须是小写,如果是AND则抛出org.apache.ibatis.builder.BuilderException:异常

<think>嗯,用户遇到了MyBatisBuilderException,错误信息是'req.wmsWoBomType'的返回值不可迭代。首先,我需要回忆一下MyBatis中常见的迭代问题,通常在使用foreach标签时出现。foreach标签要求传入的集合是可迭代的,比如List或数组。 可能用户在使用类似这样的代码:<foreach collection="req.wmsWoBomType" ...>。问题出在req.wmsWoBomType这个属性可能不是一个可迭代的对象。例如,如果wmsWoBomType是字符串或某个自定义类型,而不是List或数组,就会报错。 接下来,我需要考虑可能的解决方案。首先,检查参数对象的结构,确保wmsWoBomType确实是一个集合类型。如果用户误传了类型,需要更正。例如,如果req中的wmsWoBomType是单个对象而不是列表,那么应该调整获取参数的方式,或者将参数转换为集合类型。 另外,MyBatis的foreach标签的collection属性可以指定为@Param注解的参数名,或者当参数是POJO时,直接使用属性路径。如果参数是通过@Param指定的,可能需要检查是否正确引用了参数名。例如,如果方法参数有@Param("req"),那么在collection中应该写"req.wmsWoBomType"。 还有一种情况是,当wmsWoBomType可能为null时,MyBatis会抛出异常。这时候可以在调用Mapper方法前进行空集合判断,或者使用OGNL表达式设置默认值,比如collection="req.wmsWoBomType != null ? req.wmsWoBomType : emptyList",其中emptyList是一个预先定义的空列表。 另外,用户可能需要检查是否在参数对象中有正确的getter方法,比如getWmsWoBomType(),确保MyBatis能够正确访问该属性。 最后,建议用户添加日志或调试代码,打印出req.wmsWoBomType的实际类型和值,确认它确实是一个可迭代的集合。如果还是无法解决,可能需要更详细的代码示例来进一步分析。</think>### MyBatis BuilderException: 'req.wmsWoBomType'返回值不可迭代解决方案 #### 问题原因 该异常发生在MyBatis的`<foreach>`标签尝试迭代不可迭代对象时,常见于以下场景: $$ collection\ parameter\ 'req.wmsWoBomType'\ is\ not\ Iterable\ or\ Array $$ 1. **参数类型错误**:`req.wmsWoBomType`字段未实现`java.lang.Iterable`接口 2. **空值未处理**:当参数为null时未作空集合处理 3. **路径引用错误**:参数传递方式不符合MyBatis规范[^1] #### 解决方案 ##### 方案一:验证参数结构 确保请求对象包含可迭代字段: ```java public class RequestDTO { private List<String> wmsWoBomType; // 必须为List/Array类型 // 必须实现getter方法 public List<String> getWmsWoBomType() { return this.wmsWoBomType; } } ``` ##### 方案二:使用安全导航 在XML映射文件中添加空值检查: ```xml <select id="yourMethod"> SELECT * FROM table WHERE id IN <foreach collection="req.wmsWoBomType != null ? req.wmsWoBomType : emptyList" item="item" open="(" separator="," close=")"> #{item} </foreach> </select> ``` ##### 方案三:参数重封装 通过@Param注解明确指定集合参数: ```java @Mapper public interface YourMapper { void yourMethod(@Param("bomList") List<String> bomList); } ``` ```xml <foreach collection="bomList" ...> <!-- 直接引用重封装的集合 --> ``` #### 调试建议 1. 在DAO层添加日志输出: ```java log.debug("wmsWoBomType类型: {}", req.getWmsWoBomType().getClass()); log.debug("集合内容: {}", req.getWmsWoBomType()); ``` 2. 使用类型检查工具: ```java if (!(req.getWmsWoBomType() instanceof Iterable)) { throw new IllegalArgumentException("参数必须为可迭代类型"); } ``` #### 扩展优化 1. 自定义类型处理器实现`BaseTypeHandler` 2. 使用Spring的`@ModelAttribute`预处理参数 3. 采用MyBatis的`<script>`标签支持动态SQL : 参数传递规范详见MyBatis官方文档关于参数绑定的章节
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值