解決oracle.sql.TIMESTAMP序列化轉換失敗問題 及 J2EE13Compliant原理

目錄

  • 報錯現象
  • 報錯內容
  • 處理方法
  • Oracle驅動源碼
  • 總結

報錯現象

oracle表中存在TIMESTAMP類型的列時,jdbc查出來做序列化時報錯

報錯內容

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class java.io.ByteArrayInputStream]; 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: com.oxye.ResMsg["data"]->com.oxye.base.dto.BaseResponse["columns"]->java.util.ArrayList[0]->java.util.ArrayList[10]->oracle.sql.TIMESTAMP["stream"])
---
Caused by: org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class java.io.ByteArrayInputStream]; 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: com.oxye.ResMsg["data"]->com.oxye.base.dto.BaseResponse["columns"]->java.util.ArrayList[0]->java.util.ArrayList[10]->oracle.sql.TIMESTAMP["stream"])
---
Caused by: 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: com.oxye.ResMsg["data"]->com.oxye.base.dto.BaseResponse["columns"]->java.util.ArrayList[0]->java.util.ArrayList[10]->oracle.sql.TIMESTAMP["stream"])

處理方法

任選其一,目的就是設置一個變量:
1.項目啟動時設置一行代碼 System.setProperty(“oracle.jdbc.J2EE13Compliant”, “true”);

2.jar啟動命令增加 -Doracle.jdbc.J2EE13Compliant=true

3.oracle連接串中增加屬性oracle.jdbc.J2EE13Compliant=true

Oracle驅動源碼

版本

	<dependency><groupId>com.oracle.database.jdbc</groupId><artifactId>ojdbc8</artifactId><version>21.9.0.0</version></dependency>

oracle.jdbc.driver.GeneratedPhysicalConnection類有屬性j2ee13Compliant,可以看到
readConnectionProperties中會從多處尋找屬性oracle.jdbc.J2EE13Compliant,找不到默認是false

/***/
abstract class GeneratedPhysicalConnection extends OracleConnection {boolean j2ee13Compliant;/***/protected void readConnectionProperties(String var1, @Blind(PropertiesBlinder.class) Properties var2, @Blind(PropertiesBlinder.class) Properties var3) throws SQLException {/***/var4 = null;if (var2 != null) {var4 = var2.getProperty("oracle.jdbc.J2EE13Compliant");}if (var4 == null) {var4 = getSystemProperty("oracle.jdbc.J2EE13Compliant", (String)null);}if (var4 == null && var3 != null) {var4 = var3.getProperty("oracle.jdbc.J2EE13Compliant");}if (var4 == null) {var4 = "false";}this.j2ee13Compliant = var4 != null && var4.equalsIgnoreCase("true");/***/

oracle.jdbc.driver.TimestampAccessor的getObject方法中,會根據屬性j2ee13Compliant選擇獲取時間的方式

/***/
class TimestampAccessor extends DateTimeCommonAccessor {/***/Object getObject(int var1) throws SQLException {if (!this.isUseLess && !this.isNull(var1)) {if (this.externalType == 0) {return this.statement.connection.j2ee13Compliant ? this.getTimestamp(var1) : this.getTIMESTAMP(var1);} else {switch (this.externalType) {case 93:return this.getTimestamp(var1);default:throw (SQLException)((SQLException)DatabaseError.createSqlException(this.getConnectionDuringExceptionHandling(), 4).fillInStackTrace());}}} else {return null;}}/***/

oracle.jdbc.driver.DateTimeCommonAccessor有兩個方法getTimestamp和getTIMESTAMP,j2ee13Compliant為true時用getTimestamp獲得java.sql.Timestamp,false獲取oracle.sql.TIMESTAMP

/***/
import java.sql.Timestamp;
/***/
import oracle.sql.TIMESTAMP;
/***/
abstract class DateTimeCommonAccessor extends Accessor {/***/Timestamp getTimestamp(int var1) throws SQLException {return this.getTimestamp(var1, (Calendar)null);}/***/TIMESTAMP getTIMESTAMP(int var1) throws SQLException {return this.isNull(var1) ? null : new TIMESTAMP(this.getBytesInternal(var1));}/***/

總結

通過設置屬性oracle.jdbc.J2EE13Compliant=true,可以時oracle的timestamp以oracle.sql.TIMESTAMP類型返回,不設置時默認false,返回oracle.sql.TIMESTAMP,可能會導致序列化時類型轉換失敗等問題

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/213068.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/213068.shtml
英文地址,請注明出處:http://en.pswp.cn/news/213068.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

x86和ARM中配置無線網SSID和PASSWORD

提供一個可行的方法 1.準備文件 hostapd.conf &#xff1a;是用戶控件的守護進程用于無線接入點&#xff08;AP&#xff09;和授權服務器&#xff08;authentication servers)&#xff0c;存放路徑&#xff1a;/etc/hostapd/hostapd.conf interfacewlp5s0 drivernl80211 chan…

Java中多線程中 synchronized 鎖升級的原理是什么?

Java中多線程中 synchronized 鎖升級的原理是什么&#xff1f; 在 Java 中&#xff0c;synchronized 鎖的升級是指在不同的場景下&#xff0c;鎖的性能優化。Java 的鎖有多個狀態&#xff0c;主要包括偏向鎖、輕量級鎖和重量級鎖。 偏向鎖&#xff1a;當只有一個線程訪問同步塊…

acwing算法提高之動態規劃--背包模型(三)

目錄 1 基礎知識2 模板3 工程化 1 基礎知識 暫無。。。 2 模板 暫無。。。 3 工程化 題目1&#xff1a;潛水員。 解題思路&#xff1a;DP。 狀態定義f[i][j][k]&#xff1a;從前i個物品中選&#xff0c;氧氣至少為j&#xff0c;氮氣至少為k的最小方案數。 狀態轉移&…

解決idea 通過build project 手動觸發熱部署失敗

在debug運行項目的過程中&#xff0c;并且保證&#xff08;不添加方法&#xff0c;不修改方法名&#xff09;一定的規則的情況下&#xff0c;可以通過build project 來手動熱部署項目&#xff0c;也就是會交換class文件與resouces文件。 設置項 Edit Configurations Modify Op…

計算機圖形學理論(1):建模基礎

本系列根據國外一個圖形小哥的講解為本&#xff0c;整合互聯網的一些資料&#xff0c;結合自己的一些理解。 場景的組成部分 場景相當于一個或多個模型的集合。模型包含以下內容&#xff1a; 結構描述&#xff1a;幾何形狀&#xff0c;如頂點、紋理坐標等表面描述&#xff1a…

Vue3中的defineModel

目錄 一、vue3的defineModel介紹 二、defineModel使用 &#xff08;1&#xff09;在vite.config.js中開啟 &#xff08;2&#xff09;子組件 &#xff08;3&#xff09;父組件 一、vue3的defineModel介紹 為什么要使用到defineModel呢&#xff1f;這里有這樣一種場景&…

“快速排序:一種美麗的算法混沌”(1.hoare)

歡迎來到我的博客&#xff01;在今天的文章中&#xff0c;我將采用一種獨特且直觀的方式來探討我們的主題&#xff1a;我會使用一幅圖像來貫穿整篇文章的講解。這幅精心設計的圖表不僅是我們討論的核心&#xff0c;也是一個視覺輔助工具&#xff0c;幫助你更深入地理解和掌握本…

學習深度強化學習---第2部分----RL動態規劃相關算法

文章目錄 2.1節 動態規劃簡介2.2節 值函數與貝爾曼方程2.3節 策略評估2.4節 策略改進2.5節 最優值函數與最優策略2.6節 值迭代與策略迭代2.7節 動態規劃求解最優策略 本部分視頻所在地址&#xff1a;深度強化學習的理論與實踐 2.1節 動態規劃簡介 態規劃有兩種思路&#xff1…

前端 Web Workers 簡介

簡介 以前我們總說&#xff0c;JS 是單線程沒有多線程&#xff0c;當 JS 在頁面中運行長耗時同步任務的時候就會導致頁面假死影響用戶體驗&#xff0c;從而需要設置把任務放在任務隊列中&#xff1b;執行任務隊列中的任務也并非多線程進行的&#xff0c;然而現在 HTML5 提供了…

App備案、ios備案Bundle ID查詢、公鑰信息、SHA-1值

App備案、ios備案Bundle ID查詢、公鑰信息、SHA-1值 Bundle ID這個就不說了&#xff0c;都知道是啥&#xff0c;主要說公鑰信息和SHA-1值的獲取 打開鑰匙串訪問&#xff0c;找到當前需要備案App的dis證書&#xff0c;如下&#xff1a; #####右鍵點擊顯示簡介 #####可以看…

03.仿簡道云公式函數實戰-QLExpress初探

1. 前言 在上一篇文章中&#xff0c;我們簡單介紹了一下表達式引擎&#xff0c;并引出我們的主角QLExpress.在這篇文章中&#xff0c;我們先來一個QLExpress的熱身。 2. 初探QLExpress 源碼地址&#xff1a;https://github.com/alibaba/qlExpress 筆者下載源碼的版本是3.3.…

STL源碼剖析筆記——適配器(adapters)

系列文章目錄 STL源碼剖析筆記——迭代器 STL源碼剖析筆記——vector STL源碼剖析筆記——list STL源碼剖析筆記——deque、stack&#xff0c;queue STL源碼剖析筆記——Binary Heap、priority_queue STL源碼剖析筆記——AVL-tree、RB-tree、set、map、mutiset、mutimap STL源…

【Spring 基礎】00 入門指南

【Spring 基礎】00 入門指南 文章目錄 【Spring 基礎】00 入門指南1.簡介2.概念1&#xff09;控制反轉&#xff08;IoC&#xff09;2&#xff09;依賴注入&#xff08;DI&#xff09; 3.核心模塊1&#xff09;Spring Core2&#xff09;Spring AOP3&#xff09;Spring MVC4&…

php實現截取姓名中的第一個字作為頭像的實戰記錄

php 截取中文字符串第一個字 substr 函數 在 PHP 中&#xff0c;使用 substr 函數來截取中文字符串的第一個字。由于 PHP 默認的字符編碼是 UTF-8&#xff0c;它可以正確處理中文字符。 $chineseString "你好世界"; $firstChar substr($chineseString, 0, 1); e…

vue2 組件內路由守衛使用

1、beforeRouteEnter 進入頁面 to – 即將要跳轉到的頁面 form – 跳轉前的頁面&#xff0c;從哪個頁面跳轉過來的 next – 下一步&#xff0c;若無指定跳轉的路由&#xff0c;設置為空 next() 即可 beforeRouteEnter(to, from, next) {next() }, 使用 beforeRouteEnter 時&…

中文分詞演進(查詞典,hmm標注,無監督統計)新詞發現

查詞典和字標注 目前中文分詞主要有兩種思路&#xff1a;查詞典和字標注。 首先&#xff0c;查詞典的方法有&#xff1a;機械的最大匹配法、最少詞數法&#xff0c;以及基于有向無環圖的最大概率組合&#xff0c;還有基于語言模型的最大概率組合&#xff0c;等等。 查詞典的方法…

知識產權服務企業網站建設效果如何

知識產權服務也有較高的市場需求度&#xff0c;尤其如今互聯網深入到各個行業&#xff0c;無論個人還是企業都會以不同的方式經營&#xff0c;相應的為保障自身權益&#xff0c;注冊商標、專利等自然不可少&#xff0c;而對普通小白來說&#xff0c;想要完成這些流程也是有些難…

Python實現獲取b站視頻的彈幕內容

前言 本文是該專欄的第39篇,后面會持續分享python的各種干貨知識,值得關注。 在本專欄之前,有詳細介紹使用python增加b站視頻的播放量方法,感興趣的同學可往前翻閱《Python-增加b站視頻播放量》。而本文,筆者再來單獨的詳細介紹,通過python來獲取b站視頻的彈幕內容。如下…

CGAL的3D皮膚表面網格

1、介紹 Edelsbrunner 引入的皮膚表面和具有豐富而簡單的組合和幾何結構&#xff0c;使其適合在生物計算中模擬大分子。 對這些表面進行網格劃分通常是進一步處理其幾何形狀所必需的&#xff0c;例如在數值模擬和可視化中。 皮膚表面由一組加權點&#xff08;輸入球&#xff09…

力扣labuladong——一刷day70

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、力扣814. 二叉樹剪枝二、力扣1325. 刪除給定值的葉子節點 前言 這道題的難點在于要一直剪枝&#xff0c;直到沒有值為 0 的葉子節點為止&#xff0c;只有從…