前言:最近在做一个通用查询单表的组件,所以 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 报错...相关推荐

  1. oracle 提示表或试图不存在,其实是存在的,select没有问题,只有insert或者update才报错...

    oracle 提示表或试图不存在,其实是存在的,select没有问题,只有insert或者update才报错 原因可能是插入字段的值格式不匹配导致的,需要检查字段的值 转载于:https://www. ...

  2. 使用mybatis插入数据到数据库中,显示插入成功,且没有报错,但是数据库中并没有新插入的数据的原因

    使用mybatis插入数据到数据库中,显示插入成功,且没有报错,但是数据库中并没有数据的原因 没有提交事务,有时没有配置自动提交事务的设置,所以需要手动提交事务,即 sqlSession.commit ...

  3. 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 ...

  4. GitLabCICD实战----在.gitlab-ci.yml文件的步骤中使用git clone 另一个代码仓报错的解决办法

    更多信息请关注 个人网站 一.背景 在有些时候,比如在一个项目中,产品的代码是java代码仓,自动化测试脚本是python语言,单独存放的代码仓,在使用GitlabCICD构建流水线的时候有这样一种场 ...

  5. 【Oracle 19c】解决 Oracle EM(Enterprise Manager) Express 切换回旧版后无法访问的问题

    文章目录 问题描述 解决方案 解决过程 1.按 Oracle EM Express 提示下载 Adobe Flash Player PPAPI 版 1.按 F12 查看 HTTP 请求头 2.找到问题 ...

  6. oracle 状态unknown,解决Oracle crs_stat状态为UNKNOWN有关问题

    当前位置:我的异常网» 数据库 » 解决Oracle crs_stat状态为UNKNOWN有关问题 解决Oracle crs_stat状态为UNKNOWN有关问题 www.myexceptions.n ...

  7. python response.json()报错_Django JsonResponse json格式报错 解决Django响应JsonResponse返回json格式数据报错问题...

    想了解解决Django响应JsonResponse返回json格式数据报错问题的相关内容吗,彭世瑜在本文为您仔细讲解Django JsonResponse json格式报错的相关知识和一些Code实例 ...

  8. php 函数返回值mixed,认识函数的类型、参数与返回值

    函数的类型.参数与返回值 一.函数的基本语法语法 functionfunctionName(类型限定参数列表):返回值类型 { } 案例:计算两个数之和. functionsum(int$a,int$ ...

  9. python response.json()报错_解决Django响应JsonResponse返回json格式数据报错问题

    解决Django响应JsonResponse返回json格式数据报错问题,给大家,报错,代码,图书,希望能 解决Django响应JsonResponse返回json格式数据报错问题 易采站长站,站长之 ...

最新文章

  1. matlab plot不均匀间隔,matplotlib如何绘制间隔为2^n的不均匀图形?
  2. String.Split()函数
  3. 实时SLAM的未来及深度学习与SLAM对比
  4. td里面的内容加了br不起作用_刀圈TD黑暗游侠,最容易打金之一!!
  5. 如何快速实现高并发短文检索-转
  6. JZOJ 5443. 【NOIP2017提高A组冲刺11.2】字典序
  7. ThreadLocal的使用[代码片段]
  8. JSP中的forward指令
  9. python任务调度平台 界面_分布式任务调度平台XXL-JOB搭建教程
  10. ecos中的spl同步机制
  11. 28、Oracle(四)用户权限控制
  12. Keil4新建汇编模板工程
  13. qt.qpa.plugin:Cound not load the QT platform plugin “windows“ in “ “even though it was found.
  14. 博客迁移说明 : )
  15. 查询某个表空间下所有的表的空间占用情况
  16. Mysql数据库基础知识总结,结构分明,内容详细
  17. java简易计算器实验报告_Java 《Java 实现简单计算器》实验报告
  18. phaser3适配微信小游戏
  19. 基于java+jsp的酒店预订系统
  20. 有发现pcb板上的红胶吗?pcb上红胶作用是什么

热门文章

  1. 比对两个数据库中数据表结构异同
  2. win7 linux启动设置u盘启动,在linux下怎么样制作win7的U盘启动?
  3. matlab中ndims函数,matlab中的size(),length(),ndims()函数的用法
  4. java se开发工具_JavaSE基础代码(1)-Hi ShanShi与开发工具
  5. antvue 有赞布局_UI大全:前端UI框架集合(持续更新,当前32个)
  6. java 类型转string类型_java常用类String与其他数据类型之间的转化
  7. 中文拼写纠错_58搜索拼写纠错
  8. java中id name_关于DOM对象中的id与name的区别
  9. HALCON 20.11:深度学习笔记(5)---设置超参数
  10. SQL Server 2014安装图解