@Value读取properties类型错误:Invalid boolean value [${spring.datasource.testWhileIdle}]

解决Spring框架中因配置文件类型转换错误导致的问题,分享在Eclipse及Idea中正确加载properties配置的方法。

昨天在开发过程中,遇到一个比较无语的问题:重新拉一份代码搭框架,在启动的时候读取properties配置文件报类型转换错误,因为代码是一样的,所以排除代码的问题,在百度谷歌搜索了一遍没有找到能够解决的办法。现已解决,给大家分享解决办法,希望能帮助各位。

先贴上报错信息:
Unsatisfied dependency expressed through field 'testWhileIdle'; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'boolean'; nested exception is java.lang.IllegalArgumentException: Invalid boolean value [${spring.datasource.testWhileIdle}]

我们可以看到,报错信息给我们的提示是,String转Boolean类型错误。

这里写图片描述

这里使用了spring的@Value注解,我在配置文件中填的是 true。

后来我对读到的参数进行强转类型,依旧报错。可以确定取到的值是不正确的

经过测试,读取值,发现读取到的值为 spring.datasource.testWhileIdle 而不是 true (spring在读取配置文件时,如果不能读取到,@Value取到的值就是括号里面的值,有点坑。)

我们可以断定未加载properties成功。

知道了读取不到的真正原因之后,其实再去搜索问题就比较简单了。

eclipse解决方案:由于eclipse配置源代码excludes过滤掉了application.properties或application.yml造成的,具体位置在: Project Properties --> Java Build Path --> Source(tab) --> Source folders on build path: [Exclusion section]

目前在idea里的配置我还不太清楚,我用的是idea,最后通过pom.xml解决问题
这里写图片描述

引入properties,最终解决。

<think>好的,用户遇到了一个MyBatis的异常,错误信息是“invalid comparison: java.util.Date and java.lang.String”。我需要先理解这个错误的原因。通常,这个错误发生在MyBatis的XML映射文件中,当在动态SQL(比如<if>标签)中错误地比较了Date类型和String类型的时候。例如,用户可能在某个条件中将一个Date类型的字段与一个String类型的参数进行比较,比如使用!= ''来判断非空,而这里传入的其实是一个Date对象,导致类型不匹配。 接下来,我需要考虑用户可能的场景。用户可能在编写MyBatis的查询时,在动态条件中使用了类似<if test="startDate != null and startDate != ''">这样的判断。这里的问题在于,startDate是一个Date类型的对象,而和空字符串''进行比较是不合法的,因为Date和String类型不能直接比较,从而导致IllegalArgumentException。 然后,我需要回忆MyBatis在处理动态SQL时的类型处理机制。MyBatis在解析OGNL表达式时,会检查比较操作的两边类型是否兼容。如果用户不小心将Date类型与String进行比较,就会触发这个错误。正确的做法应该是只检查Date是否为null,而不需要检查空字符串,因为Date对象本身不会是空字符串。 另外,可能的解决方案包括:修改XML中的条件判断,去掉与空字符串的比较;或者在Java代码中确保传入的参数类型正确;或者在比较前进行类型转换。此外,用户可能没有注意到在MyBatis的映射文件中,参数的类型需要与数据库字段类型匹配,尤其是在处理日期时间时,可能需要明确指定jdbcType。 同时,用户可能没有正确配置类型处理器(TypeHandler),导致MyBatis在处理日期类型时出现了问题。例如,数据库中的日期字段是DATE或TIMESTAMP类型,而Java中使用的是java.util.Date,如果没有正确的类型处理器,可能会导致类型转换问题。 还需要考虑用户是否在传递参数时,错误地将Date类型转换为String,例如在Java代码中将日期格式化为字符串后再传入MyBatis,这可能导致在动态SQL中的比较出现类型不匹配。因此,需要检查参数传递的代码,确保传入的是Date对象而不是字符串。 最后,我应该建议用户检查他们的XML映射文件中的相关部分,特别是动态SQL的条件判断,确保没有不恰当的类型比较。同时,提醒他们在处理日期类型时,使用合适的jdbcType和类型处理器,避免此类错误的发生。</think>这个错误通常发生在 MyBatis 进行动态 SQL 参数比较时类型不匹配,具体解决步骤如下: ### 错误核心原因 `java.util.Date` 类型与 `java.lang.String` 类型在 MyBatis 的动态 SQL 中被直接比较,常见于以下场景: ```xml <if test="createTime != null and createTime != ''"> <!-- 错误写法 --> AND create_time = #{createTime} </if> ``` ### 分步解决方案 #### 1. 修正 XML 映射文件 **错误写法**:日期类型与空字符串比较 ```xml <!-- ❌ 错误示例 --> <if test="createTime != null and createTime != ''"> ``` **正确写法**:仅检查 null ```xml <!-- ✅ 正确方案 --> <if test="createTime != null"> AND create_time = #{createTime, jdbcType=TIMESTAMP} </if> ``` #### 2. 参数类型处理 ```java // Controller 层确保参数类型正确 @GetMapping("/query") public Result queryData(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date createTime) { // 直接传递 Date 类型参数 return service.query(createTime); } ``` #### 3. 特殊场景处理(需字符串比较时) ```xml <!-- 先转换为字符串再比较 --> <if test="createTime != null"> AND DATE_FORMAT(create_time, '%Y-%m-%d') = #{createTime, typeHandler=org.apache.ibatis.type.DateTypeHandler} </if> ``` ### 关键配置补充 在 `application.properties` 中添加: ```properties # 关闭 MyBatis 的字段空值自动类型推断 mybatis.configuration.call-setters-on-nulls=true ``` ### 常见触发场景示例 ```java // ❌ 错误:将日期格式化为字符串传递 params.put("createTime", new SimpleDateFormat("yyyy-MM-dd").format(new Date())); // ✅ 正确:直接传递 Date 对象 params.put("createTime", new Date()); ``` ### 高级排查方法 1. 启用 MyBatis 完整日志: ```properties logging.level.org.mybatis=DEBUG ``` 2. 检查 SQL 参数绑定过程: ```log DEBUG o.a.i.logging.jdbc.BaseJdbcLogger ==> Parameters: 2023-08-28 15:30:45(Timestamp) ``` ### 补充建议 - 使用 `@JsonFormat` 规范日期序列化: ```java @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; ``` - 对于复杂查询建议使用 `<choose>` 结构: ```xml <choose> <when test="startTime != null and endTime != null"> BETWEEN #{startTime} AND #{endTime} </when> <when test="startTime != null"> >= #{startTime} </when> </choose> ``` 通过修正参数类型比较方式并规范类型处理,可有效解决该异常。建议结合日志验证参数绑定过程是否符合预期。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值