源碼分析 There is no getter for property named '*' in 'class java.lang.String

There is no getter for property named '*' in 'class java.lang.String',此錯誤之因此出現,是由於mybatis在對parameterType="String"的sql語句作了限制,假如你使用<when test="username != null">這樣的條件判斷時,就會出現該錯誤,不過今天咱們來刨根問底一下java

1、錯誤再現

想要追本溯源,就須要錯誤再現,那麼假設咱們有這樣一個sql查詢:sql

<select id="getRiskMember" resultMap="BaseResultMap" parameterType="String">
    <include refid="selectMember"/>
    <choose>
        <when test="username != null">
            and username = #{username} 
        </when>
        <otherwise>
            and safetylevel > 1
        </otherwise>
    </choose>
 </select>
  1. parameterType="String",這一點是必須得,參數類型必須是string。
  2. 該sql對應的mapper class中對應的方法爲List<Member> getRiskMember(String username);,也就是說,傳遞的參數名爲username,正常狀況下,這樣的配置合情合理。
  3. <when test="username != null">,你有一個對應的test判斷語句,也多是if。
  4. 那麼這個時候,項目運行該查詢語句時,就會拋出There is no getter for property named 'username' in 'class java.lang.String'錯誤!

2、解決辦法

固然了,若是你沒有時間來看源碼分析實例的話,我想先告訴你解決辦法,省得你被問題困擾。解決辦法很簡單,你只須要把 <when test="username != null">修改成 <when test="_parameter!= null">就行了,其餘地方不須要改動(也就是說and username = #{username}不須要改動爲and username = #{_parameter}),修改後的sql語句以下:mybatis

<select id="getRiskMember" resultMap="BaseResultMap" parameterType="String">
    <include refid="selectMember"/>
    <choose>
        <when test="_parameter != null">
            and username = #{username} 
        </when>
        <otherwise>
            and safetylevel > 1
        </otherwise>
    </choose>
 </select>
相關文章
相關標籤/搜索