一、MyBatis IndexOutOfBoundsException 异常分析
1.1 异常现象
在使用 MyBatis 进行数据库查询时,遇到了 java.lang.IndexOutOfBoundsException: Index 8 out of bounds for length 8 的异常。具体堆栈信息如下:
Caused by: org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.lang.IndexOutOfBoundsException: Index 8 out of bounds for length 8
### The error may exist in class path resource [mappers/workitem/relation/WorkItemRelationMapper.xml]
### The error may involve com.shhnc.cooperation.workitem.relation.mapper.WorkItemRelationMapper.selectRelateByWorkItemId
### The error occurred while handling results
### SQL: select rd.description as description, r.work_item_id as workItemId, r.relate_work_item_id as relateWorkItemId, r.relation_detail_template_id as relationDetailId, r.limit_type as limitType, r.relation_type as relationType, r.id as relationId, rd.relation_config_id as relationConfigId from work_item_relation r left join work_item_relation_detail_template rd on rd.id = r.relation_detail_template_id where r.work_item_id = ?
二、Lombok @Builder 注解的潜在问题
2.1 异常现象
单独使用 Lombok 的 @Builder 注解时,发现生成了全属性的构造方法,不会生成无参构造方法。如果与 @Data 注解一起使用,会发现没有了默认的构造方法。如果手动添加无参数构造方法或者用 @NoArgsConstructor 注解都会报错。
此外,@Builder 注解还可能导致默认值无效的问题。
2.2 原因分析
无参构造函数缺失:
@Builder 默认生成全参构造函数,不会生成无参构造方法,而某些框架(如 JPA、Hibernate、MyBatis)需要无参构造函数来通过反射创建实体。
解决方法是在类上同时添加 @NoArgsConstructor 注解,强制生成无参构造函数。
继承场景下的 Builder 断裂:
在继承场景中,父类和子类的 @Builder 不兼容,导致无法正确构建对象。
解决方法是使用 @SuperBuilder 注解(Lombok 1.18.2+)或手动重构 Builder 方法。
默认值失效:
@Builder 会覆盖字段的默认值,需在 builder() 后手动设置。
解决方法是使用 @Builder.Default 注解来保留默认值。
2.3 解决方案
无参构造函数:
@Builder
@NoArgsConstructor // 强制生成无参构造
@AllArgsConstructor // 保证Builder仍可用
public class User {
private Long id;
private String name;
}
继承场景:
@SuperBuilder
public class Parent { /*...*/ }
@SuperBuilder
public class Child extends Parent { /*...*/ }
默认值:
@Builder
public class Config {
@Builder.Default // 解决方案:使用此注解
private int timeout = 30;
}
三、总结
在使用 MyBatis 和 Lombok 进行开发时,需要注意以下几点:
MyBatis 的 IndexOutOfBoundsException 异常:主要由 ResultMap 配置、Java 类属性或查询结果处理不当引起,需仔细检查相关配置和代码逻辑。
Lombok 的 @Builder 注解问题:需注意无参构造函数的缺失、继承场景下的 Builder 断裂以及默认值失效等问题,合理使用相应的 Lombok 注解进行解决。
通过以上分析和解决方案,可以有效避免在实际开发中遇到的相关问题,提高代码的健壮性和可维护性。