昨天做SSM遇到了一个Mybatis的问题,即ReflectionException: There is no getter for property named 'xxx' in 'class java.lang.String。
触发原因:
1、接口方法为单个String类型参数:(多个参数时添加有@Param("XXX")注解,不会有此问题,参照解决方法三)
java:List<XXX> selectAllXXX(String uAccount);
sql:parameterType="java.lang.String";
2、sql中使用了动态sql判断:
<select id="selectAllXXX" resultMap="BaseResultMap" parameterType="java.lang.String">
select
<include refid="Base_Column_List" />
from xxx
<if test="uAccount != null">
where u_account = #{uAccount,jdbcType=VARCHAR}
</if>
order by e_id asc
</select>
按理说这样的写法不是应该很合法的吗?但是很奇怪就会抛出ReflectionException这个异常!
以往做项目也没注意过,今天百度了一下,原因是Mybatis对接口参数类型为String类型的sql语句判断做了限制。
源码分析参照这位大神的https://blog.csdn.net/qing_gee/article/details/47122227
这里总结了一下网上的三种解决方案,亲测有效:
- 将接口方法的参数都封装到HashMap<String, String>或自定义对象的属性中即可,其余不变;这样能在sql语句中直接使用#{key}获取参数值,动态sql的判断(如if、when)语句中也同样的方式可以获取; (sql中parameterType="XXX"的值设为java.util.HashMap)
- 将sql判断之处的<if test="YourParamName != null"></if>改为<if test="_parameter != null"></if>即可,其余不变;
- 在接口方法functionName(String uAccount)的参数前设置@Param("uAccount")注解即可,其余不变;即functionName(@Param("uAccount")String uAccount)。
【希望能对你的问题有所帮助,支持我的话帮忙点个赞吧!】