There is no getter for property named ‘xx‘ in ‘class java.lang.xx‘

吐槽

编码规范真的非常重要,如果编码时非常随意,会给后面接手项目的人留下各种坑。我最近接了一个项目,要对这个项目做重构,边重构边测试的过程中遇到了标题这个错误,这是个非常常见的错误,虽然但这次我整理出来,就是想吐槽一下编码规范的问题。参数传递不规范,同类型的方法定义格式不统一,各种问题交织在一起,我竟无语凝噎。

正题

在使用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方法,也可能出现类似问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值