SpringBoot Java转Kotlin后findById方法类型推断失败求助
解决Spring Boot Kotlin版JdbcIngredientRepository类型推断失败问题
嘿,这个问题我熟!咱们来一步步捋清楚:
你遇到的类型推断失败,核心原因是Spring的JdbcTemplate.queryForObject方法在Kotlin里会返回可空类型——因为当查询不到对应id的Ingredient记录时,这个方法会返回null,但你的findById方法签名明确要求返回非空的Ingredient,这就导致了类型不匹配,哪怕你的mapRowToIngredient确实返回非空对象也没用。
给你几个可行的解决方案,按需选择:
方案1:强制非空(适合业务上确保id一定存在的场景)
用!!操作符强制把可空类型转为非空,但要注意:如果真的出现查询不到的情况,这里会直接抛出NullPointerException,所以只适合你能保证传入的id一定存在的场景。
override fun findById(id: String): Ingredient { return jdbc.queryForObject( "select id, name, type from Ingredient where id=?", { rs, rowNum -> mapRowToIngredient(rs, rowNum)}, arrayOf(id))!! }
方案2:安全非空校验(推荐)
用requireNotNull或者checkNotNull做非空校验,还能自定义错误提示,比!!更友好,也更安全:
override fun findById(id: String): Ingredient { val ingredient = jdbc.queryForObject( "select id, name, type from Ingredient where id=?", { rs, rowNum -> mapRowToIngredient(rs, rowNum)}, arrayOf(id)) return requireNotNull(ingredient) { "找不到ID为$id的Ingredient记录" } }
方案3:修改方法返回可空类型(符合Kotlin空安全理念)
如果业务场景允许查询不到时返回null,那直接修改方法签名为返回Ingredient?,这最符合Kotlin的空安全设计:
override fun findById(id: String): Ingredient? { return jdbc.queryForObject( "select id, name, type from Ingredient where id=?", { rs, rowNum -> mapRowToIngredient(rs, rowNum)}, arrayOf(id)) }
总结一下:本质是Java的queryForObject本身允许返回null,而Kotlin对空类型的检查比Java严格得多,所以才会出现这个类型推断错误。根据你的业务场景选对应的方案就好啦!
内容的提问来源于stack exchange,提问作者YellowMaple
相关产品推荐
相关产品推荐

