调用getTimbratureOfMonth方法触发IllegalArgumentException:参数类型匹配存疑问题咨询
解决IllegalArgumentException:参数类型不匹配的问题
这种情况我碰到过好多次,核心问题大概率是DAO接口的定义和底层的ORM映射/数据库列类型没对齐,或者你传入的参数实际类型和系统期望的不匹配。咱们一步步来解决:
1. 先查DAO的底层映射配置
你看到方法定义里第二个参数是String,但系统提示要整数,很可能是底层的SQL映射(比如MyBatis的XML、JPA的注解)里,这个参数对应的是数据库的整数类型字段,或者映射配置强制要求了Integer类型:
- 如果是MyBatis:打开对应的Mapper XML,找到
getTimbratureOfMonth的SQL语句,检查参数的类型配置。比如有没有写<parameter property="month" javaType="java.lang.Integer"/>,或者SQL里的month字段在数据库中是INT类型,而你用String传值会触发类型转换失败。 - 如果是JPA:检查实体类
TimbratureOfDay的month字段类型,如果是Integer,那即使接口定义是String,JPA也会尝试把String转Integer,一旦转换失败就会报错。同时看@Query注解里的参数绑定是否正确。
2. 确认你传入的mese变量实际类型
别光凭感觉,打印一下mese的实际类型看看:
System.out.println("mese的实际类型:" + mese.getClass().getName());
- 如果输出是
java.lang.Integer,那问题就找到了:你以为传的是String,但实际是Integer,这时候要么把接口的参数改成Integer,要么把mese转成String再传:// 转成String传入 List<TimbratureOfDay> timbratureOfMonth = timbratureDAO.getTimbratureOfMonth(timeSheetInsertDTO.getAnno(), String.valueOf(mese), idEmp); - 如果输出是
java.lang.String,那问题肯定在底层映射,回到第一步仔细检查。
3. 统一接口、映射和数据库的类型
这是最彻底的解决方式:
- 如果数据库里的
month字段是整数(比如存1-12的数字):直接把DAO接口的第二个参数改成Integer,这样从接口到数据库类型完全一致,避免转换问题:
调用时确保传入的是Integer类型的public List<TimbratureOfDay> getTimbratureOfMonth(int year, Integer month, Long idEmployee);mese(如果是String就转成Integer:Integer.parseInt(mese))。 - 如果数据库里的
month是字符串(比如"01"、"12"):确认映射层的参数类型是String,实体类字段也是String,同时保证传入的mese是符合格式的字符串(比如补前导零)。
按这个流程排查,基本就能解决问题了。
内容的提问来源于stack exchange,提问作者santocielo99
相关产品推荐
相关产品推荐

