Mybatis handler MappedType踩坑

數(shù)據(jù)庫的幾個字段使用到Json類型,持久層用的是Mybatis,由于沒辦法實現(xiàn)自動轉(zhuǎn)換,因此需要自己寫幾個handler。
因為json類型的字段用到的地方比較多,也不想一個一個的去寫handler,所以在代碼里使用對象的話就用Map,數(shù)組就使用List。

實體

data class Entity(
        @UDJdbcType(typeHandler = JsonListMapHandler::class)
        val list: List<Map<String, Any>>? = null,
        @UDJdbcType(typeHandler = JsonMapHandler::class)
        val obj: HashMap<String, Any>? = null,
)

@UDJdbcType是我們自己實現(xiàn)的動態(tài)生成sql的注解。
對應兩個字段,我們寫了兩個HandlerJsonListMapHandler、JsonMapHandler

@MappedTypes(List::class)
@MappedJdbcTypes(JdbcType.VARCHAR)
class JsonListMapHandler : BaseTypeHandler<List<Map<*, *>>>() {
         \\ 此處省略
}


@MappedTypes(HashMap::class)
@MappedJdbcTypes(JdbcType.VARCHAR)
class JsonMapHandler: BaseTypeHandler<HashMap<*, *>>() {
         \\ 此處省略
}

一開始list這個字段,我們使用的也是HashMap,數(shù)據(jù)庫寫操作是正常的,但調(diào)用接口讀取數(shù)據(jù)時就一直報以下錯誤,就是Gson轉(zhuǎn)換不成功。原因是遇到HashMap時會跑到JsonMapHandler里進行轉(zhuǎn)換。因為類型不對,所以轉(zhuǎn)換失敗。把第一個字段屬性List<HashMap<*, *>>改成List<Map<*, *>>,JsonListMapHandler里也使用Map,問題解決。

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

友情鏈接更多精彩內(nèi)容