一、错误现象
运行 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},并利用数据库函数转换
五、根本原因分析
- date(string) 构造方法内部调用了 date.parse(),该方法对字符串格式有严格限制(必须符合 rfc 1123 或类似标准),不适用于常见的 yyyy-mm-dd 格式。
- 该构造方法从 jdk 1.1 起就被标记为 @deprecated,官方早已不推荐使用。
六、总结
| 错误类型 | 原因 | 解决方案 |
|---|---|---|
| illegalargumentexception at date.<init> | 使用 new date(string) 传入非标准日期字符串 | 使用 simpledateformat、localdate 或 java.sql.date.valueof() 等安全方式创建日期对象 |
注意:该错误与 mybatis 配置或 sql 无关,纯粹是测试代码中的日期构造问题。修复后测试即可正常运行。
到此这篇关于mybatis测试中java.lang.illegalargumentexception错误解决的文章就介绍到这了,更多相关mybatis java.lang.illegalargumentexception错误内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论