解決:oracle+jdbc ResultMap 類型爲 map 時返回結果中存在 timestamp 時使用 jackson 轉 json 報錯

後臺報錯:

26-Sep-2018 22:18:08.209 WARNING [http-apr-8080-exec-8] org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.handleHttpMessageNotWritable Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: No serializer found for class java.io.ByteArrayInputStream and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS); nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class java.io.ByteArrayInputStream and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.HashMap["pageData"]->java.util.ArrayList[2]->java.util.HashMap["UPDATE_TIME"]->oracle.sql.TIMESTAMP["stream"]) 

表字段(oracle):

原因:

經測試,oracle 數據庫字段爲 Data 型的並不會報錯,只有 timestamp 類型會報錯。

從後臺報錯日誌中發現(through reference chain: java.util.HashMap["pageData"]->java.util.ArrayList[2]->java.util.HashMap["UPDATE_TIME"]->oracle.sql.TIMESTAMP["stream"]) ,

然後發現返回的 map 裏面 update_time 字段爲 oracle.sql.TIMESTAMP 類型,並不是 java.sql.Timestamp,所以 json 轉換出錯。

其實都是因爲 mybatis 當 ResultMap 爲 map 時,會把數據的原始類型原樣返回,所以得到的map裏面都是 oracle.sql.DATE、oracle.sql.TIMESTAMP 之類的。因爲 mybatis 在沒有指定類型時都會採用 ObjectTypeHandle 來處理字段。

解決方案:

針對TIMESTAMP類型特殊判斷即可,上圖紅色標記的方法。使用ResultSet的getTimestamp處理就OK了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章