吐槽
编码规范真的非常重要,如果编码时非常随意,会给后面接手项目的人留下各种坑。我最近接了一个项目,要对这个项目做重构,边重构边测试的过程中遇到了标题这个错误,这是个非常常见的错误,虽然但这次我整理出来,就是想吐槽一下编码规范的问题。参数传递不规范,同类型的方法定义格式不统一,各种问题交织在一起,我竟无语凝噎。
正题
在使用mybatis时遇到 There is no getter for property named ‘xx’ in ‘class java.lang.xx’ 这个错误,先要排查低级错误,如是否拼写有误,是否有对应的get方法。
如果确保没有上述两个低级错误,只传一个参数,并且这个参数是字符串或整形数值时,出现了这个问题,可以在接口定义方法中加上@Param()来解决,如
BusinessForJobInfo selectByPrimaryKey(@Param("businessId") Long businessId);
接口要这样定义方法,在参数前面加@Param(),下面的xml这样写才不会报错,如果去掉了注解,就会出现 There is no getter for property named ‘businessId’ in ‘class java.lang.Long’ 错误。
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >
select
<include refid="Base_Column_List" />
from t_business_job
where 1=1
<if test="businessId != null" >
and id = #{businessId,jdbcType=BIGINT}
</if>
</select>
另外,还有一种情况,不加注解也可以
BusinessInfo selectByPrimaryKey(Long businessId);
这种情况是xml中没有用到if标签,所以不会报错。
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >
select
<include refid="Base_Column_List" />
from t_business_job
where id = #{businessId,jdbcType=BIGINT}
</select>
上面这两种是我整理过后的可以易懂的正确代码,我之所以做记录并吐槽,是因为在最初的代码中,有两个复杂查询方法,对某个条件字段,一个用了if标签,一个没用if标签,然而在接口定义中都没有用@param注解。
当时没发现if标签的区别,所以我费解了好久,为什么一个能运行,一个不能运行。
如果前人编码时遵循了一定的编码规范,这两个方法和sql对应是统一风格的话,也就不会出现这个问题了。
总结
综上所述,There is no getter for property named ‘xx’ in 'class java.lang.xx’这类问题,大概有两种情况,一种是只传递一个参数,这个参数是字符串或整形数值时,可能会出现,这时在接口定义方法时加@param注解即可解决。当然,如果没有使用if标签,则无需加注解。
另外一种情况是传递的是对象,但因为字段拼写错误,或该属性没有写get方法,也可能出现类似问题。
6388

被折叠的 条评论
为什么被折叠?



