当前位置: 代码迷 >> 综合 >> Mybatis报错ReflectionException: There is no getter for property named xxx
  详细解决方案

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

热度:22   发布时间:2024-02-09 14:37:38.0

应用场景:

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

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

解决办法:

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

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

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

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

  <!-- xml sql语句><select id="findValidList" resultMap="ValidUrlMap">SELECT id, sourceId, url_pattern, isEnable as enableFROM commentsys_url<where><if test="_parameter != null">isEnable = #{enable}</if></where></select>

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

问题分析

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

public List<Events> find(User user); // 根据user找对应的事件<select id="find" parameterType="com.demo.bean.User" resultType="com.demo.bean.Events">SELECT * FROM events WHERE userId = #{id}
</select>
  • 于User对象里有get方法啊(不会有人写bean类不实现getter和setter吧?)

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

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

第二种方式:按index获取

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

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

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

  相关解决方案