oracle 返回hashmap,解决:oracle+myBatis ResultMap 类型为 map 时返回结果中存在 timestamp 时使用 jackson 转 json 报错...
前言:最近在做一个通用查询单表的组件,所以 sql 的写法就是 select *,然后 resultType="map" ,然后使用 jackson @ResponseBody 返回前端报错。 转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9708485.html
后台报错:
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):
sql (mybatis):
原因:
经测试,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 来处理字段。
解决方案:
自定义 typeHandle 来统一处理数据库字段类型为 timestamp 等特殊的字段。
这里 typeHandle 里面使用注解配置 JdbcType 和 JavaType。这两个注解的定义是:
@MappedTypes 定义的是 JavaType 类型,可以指定哪些 Java 类型被拦截。
@MappedJdbcTypes 定义的是 JdbcType 类型,它需要满足枚举类 org.apache.ibatis.type.JdbcType 所列的枚举类型。
代码如下:
myBatis 的配置文件中加入:
新增新的 java 类:
packagecom.yule.system.typehandler;importoracle.sql.DATE;importoracle.sql.TIMESTAMP;importoracle.sql.TIMESTAMPLTZ;importoracle.sql.TIMESTAMPTZ;import org.apache.ibatis.type.*;importjava.sql.CallableStatement;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.Date;/*** 模仿 ObjectTypeHandle 来处理 timestamp 报错问题
*@authoryule
* @date 2018/9/26 22:43*/@MappedTypes({Object.class})
@MappedJdbcTypes(value={JdbcType.TIMESTAMP})public class MyObjectTypeHandle extends BaseTypeHandler{publicMyObjectTypeHandle() {
}
@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throwsSQLException {
ps.setObject(i, parameter);
}
@Overridepublic Object getNullableResult(ResultSet rs, String columnName) throwsSQLException {
Object result=rs.getObject(columnName);return rs.wasNull() ? null: dealResult(result);
}
@Overridepublic Object getNullableResult(ResultSet rs, int columnIndex) throwsSQLException {
Object result=rs.getObject(columnIndex);return rs.wasNull() ? null: dealResult(result);
}
@Overridepublic Object getNullableResult(CallableStatement cs, int columnIndex) throwsSQLException {
Object result=cs.getObject(columnIndex);return cs.wasNull() ? null: dealResult(result);
}/*** 为了解决错误:
* 26-Sep-2018 14:21:06.634 WARNING [http-apr-8080-exec-6] 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[0]->java.util.HashMap["UPDATE_TIME"]->oracle.sql.TIMESTAMP["stream"])
*@paramresult
*@return*@throwsSQLException*/
private Object dealResult(Object result) throwsSQLException {if (result instanceofTIMESTAMP) {return newDate(((TIMESTAMP) result).dateValue().getTime());
}else if (result instanceofDATE) {return newDate(((DATE) result).dateValue().getTime());
}else if (result instanceofTIMESTAMPLTZ) {return newDate(((TIMESTAMPLTZ) result).dateValue().getTime());
}else if (result instanceofTIMESTAMPTZ) {return newDate(((TIMESTAMPTZ) result).dateValue().getTime());
}else{returnresult;
}
}
}
转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9708485.html
原文:https://www.cnblogs.com/yuxiaole/p/9708485.html
oracle 返回hashmap,解决:oracle+myBatis ResultMap 类型为 map 时返回结果中存在 timestamp 时使用 jackson 转 json 报错...相关推荐
- oracle 提示表或试图不存在,其实是存在的,select没有问题,只有insert或者update才报错...
oracle 提示表或试图不存在,其实是存在的,select没有问题,只有insert或者update才报错 原因可能是插入字段的值格式不匹配导致的,需要检查字段的值 转载于:https://www. ...
- 使用mybatis插入数据到数据库中,显示插入成功,且没有报错,但是数据库中并没有新插入的数据的原因
使用mybatis插入数据到数据库中,显示插入成功,且没有报错,但是数据库中并没有数据的原因 没有提交事务,有时没有配置自动提交事务的设置,所以需要手动提交事务,即 sqlSession.commit ...
- react 中使用import()实现按需加载报错 解决方法 --‘import’ and ‘export’ may only appear at the top level
react 中使用import()实现按需加载报错 解决方法 --'import' and 'export' may only appear at the top level 参考文章: (1)rea ...
- GitLabCICD实战----在.gitlab-ci.yml文件的步骤中使用git clone 另一个代码仓报错的解决办法
更多信息请关注 个人网站 一.背景 在有些时候,比如在一个项目中,产品的代码是java代码仓,自动化测试脚本是python语言,单独存放的代码仓,在使用GitlabCICD构建流水线的时候有这样一种场 ...
- 【Oracle 19c】解决 Oracle EM(Enterprise Manager) Express 切换回旧版后无法访问的问题
文章目录 问题描述 解决方案 解决过程 1.按 Oracle EM Express 提示下载 Adobe Flash Player PPAPI 版 1.按 F12 查看 HTTP 请求头 2.找到问题 ...
- oracle 状态unknown,解决Oracle crs_stat状态为UNKNOWN有关问题
当前位置:我的异常网» 数据库 » 解决Oracle crs_stat状态为UNKNOWN有关问题 解决Oracle crs_stat状态为UNKNOWN有关问题 www.myexceptions.n ...
- python response.json()报错_Django JsonResponse json格式报错 解决Django响应JsonResponse返回json格式数据报错问题...
想了解解决Django响应JsonResponse返回json格式数据报错问题的相关内容吗,彭世瑜在本文为您仔细讲解Django JsonResponse json格式报错的相关知识和一些Code实例 ...
- php 函数返回值mixed,认识函数的类型、参数与返回值
函数的类型.参数与返回值 一.函数的基本语法语法 functionfunctionName(类型限定参数列表):返回值类型 { } 案例:计算两个数之和. functionsum(int$a,int$ ...
- python response.json()报错_解决Django响应JsonResponse返回json格式数据报错问题
解决Django响应JsonResponse返回json格式数据报错问题,给大家,报错,代码,图书,希望能 解决Django响应JsonResponse返回json格式数据报错问题 易采站长站,站长之 ...
最新文章
- matlab plot不均匀间隔,matplotlib如何绘制间隔为2^n的不均匀图形?
- String.Split()函数
- 实时SLAM的未来及深度学习与SLAM对比
- td里面的内容加了br不起作用_刀圈TD黑暗游侠,最容易打金之一!!
- 如何快速实现高并发短文检索-转
- JZOJ 5443. 【NOIP2017提高A组冲刺11.2】字典序
- ThreadLocal的使用[代码片段]
- JSP中的forward指令
- python任务调度平台 界面_分布式任务调度平台XXL-JOB搭建教程
- ecos中的spl同步机制
- 28、Oracle(四)用户权限控制
- Keil4新建汇编模板工程
- qt.qpa.plugin:Cound not load the QT platform plugin “windows“ in “ “even though it was found.
- 博客迁移说明 : )
- 查询某个表空间下所有的表的空间占用情况
- Mysql数据库基础知识总结,结构分明,内容详细
- java简易计算器实验报告_Java 《Java 实现简单计算器》实验报告
- phaser3适配微信小游戏
- 基于java+jsp的酒店预订系统
- 有发现pcb板上的红胶吗?pcb上红胶作用是什么
热门文章
- 比对两个数据库中数据表结构异同
- win7 linux启动设置u盘启动,在linux下怎么样制作win7的U盘启动?
- matlab中ndims函数,matlab中的size(),length(),ndims()函数的用法
- java se开发工具_JavaSE基础代码(1)-Hi ShanShi与开发工具
- antvue 有赞布局_UI大全:前端UI框架集合(持续更新,当前32个)
- java 类型转string类型_java常用类String与其他数据类型之间的转化
- 中文拼写纠错_58搜索拼写纠错
- java中id name_关于DOM对象中的id与name的区别
- HALCON 20.11:深度学习笔记(5)---设置超参数
- SQL Server 2014安装图解