java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > MyBatis java.lang.IllegalArgumentException错误

MyBatis测试中java.lang.IllegalArgumentException错误解决

作者:步行cgn

本文主要介绍了MyBatis测试中java.lang.IllegalArgumentException错误解决,这通常是因为使用了已废弃的 new Date(String) 构造方法,它无法解析常见的 yyyy-MM-dd 格式,下面就来详细的介绍一下该问题的解决

一、错误现象

运行 JUnit 测试时抛出:

java.lang.IllegalArgumentException
	at java.base/java.util.Date.parse(Date.java:616)
	at java.base/java.util.Date.<init>(Date.java:272)
	at com.xie.mybaits.test.MyBatisTest.test1(MyBatisTest.java:17)

二、错误含义

这个错误与 MyBatis 无关,而是由于测试代码中使用了不安全的日期构造方法。

从堆栈信息可以看出,在你的 MyBatisTest.test1 方法的第 17 行,调用了 new Date(String) 构造方法。这个构造方法在 Java 中已被标记为废弃(Deprecated),因为它依赖于 Date.parse() 方法,而该方法对字符串的格式要求非常严格,且不可预测。

当传入的字符串无法被 Date.parse() 解析为合法日期时,就会抛出 IllegalArgumentException。

三、错误复现示例

你的测试代码可能类似于:

@Test
public void test1() {
    // 错误示例:直接 new Date(String)
    Date date = new Date("2024-01-01");  // 第17行,抛出异常
    Student student = studentMapper.selectStudentByBirth(date);
    // ...
}

Date.parse() 只能识别特定格式(如 "Sat, 12 Aug 1995 13:30:00 GMT"),而 "2024-01-01" 这种格式并不被支持,因此抛出异常。

四、解决方案

方案一:使用SimpleDateFormat(传统方式)

将字符串解析为 Date 对象,使用 SimpleDateFormat 指定格式:

@Test
public void test1() throws ParseException {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    Date date = sdf.parse("2024-01-01");
    Student student = studentMapper.selectStudentByBirth(date);
    // ...
}

方案二:使用 Java 8 的LocalDate(推荐)

如果你的项目使用 Java 8 或更高版本,推荐使用 LocalDate 和 DateTimeFormatter,更加清晰且线程安全。

@Test
public void test1() {
    LocalDate localDate = LocalDate.parse("2024-01-01");
    // 如果需要 java.util.Date,可以转换
    Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
    Student student = studentMapper.selectStudentByBirth(date);
    // ...
}

方案三:使用java.sql.Date(适用于 JDBC)

如果 Mapper 方法参数是 java.sql.Date,可以直接使用:

@Test
public void test1() {
    Date date = java.sql.Date.valueOf("2024-01-01");
    Student student = studentMapper.selectStudentByBirth(date);
    // ...
}

方案四:将参数类型改为String

如果 Mapper 接口方法参数可以改为 String,那么就不需要转换,直接传入字符串即可。

// Mapper 接口
Student selectStudentByBirth(@Param("birth") String birth);

// XML 中可以使用 #{birth},并利用数据库函数转换

五、根本原因分析

六、总结

错误类型原因解决方案
IllegalArgumentException at Date.<init>使用 new Date(String) 传入非标准日期字符串使用 SimpleDateFormat、LocalDate 或 java.sql.Date.valueOf() 等安全方式创建日期对象

注意:该错误与 MyBatis 配置或 SQL 无关,纯粹是测试代码中的日期构造问题。修复后测试即可正常运行。

到此这篇关于MyBatis测试中java.lang.IllegalArgumentException错误解决的文章就介绍到这了,更多相关MyBatis java.lang.IllegalArgumentException错误内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文