当前位置: 首页 > news >正文

解决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.lryc.cn/news/255978.html

相关文章:

  • QQ2023备份
  • HNU计算机结构体系-实验2:CPU动态指令调度Tomasulo
  • 智慧城市是什么?为什么要建智慧城市?
  • 数据结构线性表-栈和队列的实现
  • IntelliJ IDEA 的 HTTP 客户端的高级用法
  • 代码随想录算法训练营第四十六天 _ 动态规划_198.打家劫舍、213.打家劫舍II、337.打家劫舍 III。
  • ffmpeg编译问题
  • 【flink番外篇】1、flink的23种常用算子介绍及详细示例(3)-window、distinct、join等
  • centos7做gitlab数据灾备项目地址指向问题
  • leetcode:93. 复原 IP 地址
  • 玄子Share-CSS3 弹性布局知识手册
  • Nat easy IP ACL
  • Numpy数组的数据类型汇总 (第4讲)
  • 通讯app:
  • 【Backbone】TransNeXt:最新ViT模型(原理+常用神经网络汇总)
  • 使用Java将图片添加到Excel的几种方式
  • 用什么台灯对眼睛最好?考公护眼台灯推荐
  • 【嵌入式开发 Linux 常用命令系列 4.2 -- .repo 各个目录介绍】
  • 【C++学习手札】基于红黑树封装模拟实现map和set
  • linux查看当前路径的所有文件大小;linux查看当前文件夹属于什么文件系统
  • PPT插件-好用的插件-超级文本-大珩助手
  • Kafka中的Topic
  • LAMP部署
  • DouyinAPI接口开发系列丨商品详情数据丨视频详情数据
  • AWS Remote Control ( Wi-Fi ) on i.MX RT1060 EVK - 3 “编译 NXP i.MX RT1060”( 完 )
  • 5G - NR物理层解决方案支持6G非地面网络中的高移动性
  • python epub文件解析
  • Visual Studio 2015 中 FFmpeg 开发环境的搭建
  • 期末速成数据库极简版【存储过程】(5)
  • Android Studio的代码笔记--IntentService学习