Mybatis报错ReflectionException: There is no getter for property named xxx

小灰灰 2022-05-07 21:26 384阅读 0赞

应用场景:

  1. // DAO层接口
  2. public List<ValidUrl> findValidList(Boolean enable); // 注意这里是Boolean类型,而不是基本数据类型boolean
  3. <!-- xml sql语句>
  4. <select id="findValidList" resultMap="ValidUrlMap">
  5. SELECT id, sourceId, url_pattern, isEnable as enable
  6. FROM commentsys_url
  7. <where>
  8. <if test="enable != null">isEnable = #{enable}</if>
  9. </where>
  10. </select>

运行报错:ReflectionException: There is no getter for property named ‘enable’ in ‘class java.lang.Boolean’

解决办法:

1.使用@Param注解标识参数

  1. public List<ValidUrl> findValidList(@Param("enable")Boolean enable)

注:这种方式只需要在接口中添加@Param注解即可。

2.使用_parameter表示if test=“”中代替enable

  1. <!-- xml sql语句>
  2. <select id="findValidList" resultMap="ValidUrlMap">
  3. SELECT id, sourceId, url_pattern, isEnable as enable
  4. FROM commentsys_url
  5. <where>
  6. <if test="_parameter != null">isEnable = #{enable}</if>
  7. </where>
  8. </select>

注:这种方式需要修改if-test语句中使用的参数,用_parameter代替对应的name。

问题分析

乍一看原先的代码是没问题的,但如果联想到Mybatis参数映射的机制就会发现有些东西不一样了。我这里使用了boolean的包装器类型Boolean,这是个Object啊!而我们通常是如何获取对象里的某个值的呢?——get方法。但是Boolean类型并没有实现所谓的get方法,所以肯定会出问题。
这也是为什么以下的语句可以正常运行的原因:

  1. public List<Events> find(User user); // 根据user找对应的事件
  2. <select id="find" parameterType="com.demo.bean.User" resultType="com.demo.bean.Events">
  3. SELECT * FROM events WHERE userId = #{id}
  4. </select>

原因就在于User对象里有get方法啊(不会有人写bean类不实现getter和setter吧?)

这里再阐述一下Mybatis SQL查询参数映射到查询语句时的机制。
相信大家都知道以下两段代码在效果上是一样的:
第一种方式:按name获取

  1. public User find(@Param("name")String name, @Param("password")String password);
  2. <select id="find" resultType="com.demo.bean.User">
  3. SELECT * FROM user WHERE name = #{name} AND password = #{password}
  4. </select>

第二种方式:按index获取

  1. public User find(String name, String password);
  2. <select id="find" resultType="com.demo.bean.User">
  3. SELECT * FROM user WHERE name = #{0} AND password = #{1}
  4. </select>

从第二种方式可以看出来了,Mybatis传值的时候实际上是按照顺序传递的。除非使用@Param注解去标识参数们。

备注:文章中使用SELECT *的做法不值得提倡,也建议大家自己定义ResultMap。

发表评论

表情:
评论列表 (有 0 条评论,384人围观)

还没有评论,来说两句吧...

相关阅读