MyBatis IndexOutOfBoundsException 异常与 Lombok @Builder 注解的潜在问题

一、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 注解进行解决。
通过以上分析和解决方案,可以有效避免在实际开发中遇到的相关问题,提高代码的健壮性和可维护性。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容